Prerequisite Please see here to get and set your API Key environment variable.

Install the Lytix NPM package

Integration

Express Integration

Lytix provides an out of the box middleware that you can use to collect data from your NodeJS (Express) project.

To get started, simply add the middleware to your Express app.

import { LytixRequestWrapper } from "@lytix/client";

....
const app = express();
...

/**
 * Pass the logger in as the 4th argument here
 * @note The 4th argument is a boolean that can be set to true to collect metrics 
 * related to your server
 */
app.use((req, res, next) => {
  return LytixRequestWrapper(req, res, next, false);
});

Note: If you enable request metrics, data will be published with the requestDuration metric name

Manual Integration

You can always wrap your entrypoint to get access to all of Lytix log tracing features (for example if you are running a cron job and have a main entrypoint)

import { LLogger } from "@lytix/client";


const logger = new LLogger("mainEntrypoint");

const main = async () => {
  logger.info(`Log from the main process`);
  await someBackgroundProcess();
};

/**
 * All we need to do is wrap our entrypoint and everything will
 * be accessable
 */
logger.runInAsyncContext(main);

Error Capturing

Error Class

You can now just replace all your throw new Error calls with throw new LError. For example:

...
app.get("/test", async (req, res) => {
  const logger = new LLogger('testRoute');
  /**
   * Lets pretend an error happend
   */
  try {
    logger.info("Some process is starting");
    throw new LError("An unexpeted error", { env: "prod" });
  } catch (err) {
    logger.error("crazy unexpeted error with this user: 123", err);
    res.sendStatus(500);
    return;
  }

  /**
   * Magically if we ended here, we'd reply with a 200
   */
  res.send("Hello World");
});
...

The error, along with the last 20 log lines will automatically get pushed to the lytix platform here

Error Increment

You can also send an error along with related logs without throwing an error by using the increment method.

import { LErrorIncrement, LLogger } from "@lytix/client";

/**
 * An example background process
 */
const backgroundProcess = async () => {
  const logger = new LLogger("backgroundProcessExample", { userId: "123" });
  try {
    logger.info("Background process started for user!");
    throw new Error("Unexpected error!");
  } catch (err) {
    /**
     * Just increment to get the logs as well as the error
     */
    logger.error(`Unexpected error happened`, err);
    LErrorIncrement("Unexpected error");
  }
};

Examples

To see all examples please check the Github repo here

LLM Model Input Output Collection

Lytix supports automatically collecting the input and output of LLM models. To do this you can use the following

import { MetricCollector } from "@lytix/client";

await MetricCollector.captureModelIO({
  modelName: "testModelName",
  modelInput: "Some user input",
  modelOutput: "Some model output",
  metricMetadata: {
    /**
     * Optional extra data
     */
    env: "prod",
  }
);

Lytix will automatically process the input and output of the LLM model and push the metrics to the Lytix platform. You can see your model metrics in the Lytix platform here.

LLM Model Trace Collection

Lytix also supports capturing trace information (e.g. duration) for the LLM model. To do this you can use the following

import { MetricCollector } from "@lytix/client";

const response = await MetricCollector.captureModelTrace({
  modelName: "testModelName",
  modelInput: "Some user input",
  generateModelOutput: async () => {
    const openai = new OpenAI();
    ...
    /**
     * This callback is expecting the model output to be returned
     */
    return response;
  }
});

You’ll now see the model duration trace in the Lytix platform here.

Manual Metric Collection

You always have the option to manually push metrics to the Lytix platform with custom names and metadata.

The following example pushes a metric to the Lytix platform with the name testMetic and the value 1 along with the env: prod metadata.

import { MetricCollector } from "@lytix/client";

await MetricCollector.increment("testMetic", 1, { env: "prod" });

You then have access to that on the Lytix platform and can filter on any of the metadata passed.