A progressive Node.js framework for building efficient and scalable server-side applications.
@nestjs/observe is an observability module for NestJS applications. It instruments HTTP, GraphQL, microservice (RPC), BullMQ queue handlers, and @nestjs/schedule cron/interval/timeout jobs, collects traces, runtime metrics, custom metrics, and CPU profiles, and ships them to a collector from a detached worker thread so the request path stays untouched.
$ npm install @nestjs/observeSign up at observe.nestjs.com and create a service. The dashboard issues an app key and an app secret, which the agent sends on every ingest request.
Free for up to 300,000 events a month, which covers most individual projects, startups, and small applications.
The secret is shown once and is not retrievable afterwards - store it with the rest of your secrets and supply both from the environment:
OBSERVE_APP_KEY=...
OBSERVE_APP_SECRET=...Without valid credentials the collector answers 401 and telemetry is dropped.
createObserveModule() returns both the dynamic module and the instrumentation
hook Nest needs at bootstrap:
// observe.ts
import { createObserveModule } from "@nestjs/observe";
export const { ObserveModule, ObserveInstrument } = createObserveModule();// app.module.ts
import { Module } from "@nestjs/common";
import { ObserveModule } from "./observe";
@Module({
imports: [
ObserveModule.forRoot({
appKey: process.env.OBSERVE_APP_KEY,
appSecret: process.env.OBSERVE_APP_SECRET,
serviceId: "my-service",
}),
],
})
export class AppModule {}// main.ts
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app.module";
import { ObserveInstrument } from "./observe";
async function bootstrap() {
const app = await NestFactory.create(AppModule, {
instrument: ObserveInstrument,
});
await app.listen(3000);
}
bootstrap();ObserveModule.forRootAsync() resolves the options from the DI container, via
useFactory, useClass, or useExisting:
ObserveModule.forRootAsync({
imports: [ConfigModule],
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
appKey: config.getOrThrow("OBSERVE_APP_KEY"),
appSecret: config.getOrThrow("OBSERVE_APP_SECRET"),
serviceId: config.getOrThrow("OBSERVE_SERVICE_ID"),
}),
});useClass and useExisting take a class implementing ObserveOptionsFactory:
@Injectable()
export class ObserveConfig implements ObserveOptionsFactory {
createObserveOptions(): ObserveOptions {
return { appKey: "...", appSecret: "...", serviceId: "..." };
}
}Protocol integrations are only loaded when you use them, and their packages are optional peers:
@nestjs/microservices- RPC/microservice instrumentation@nestjs/graphql- GraphQL operation instrumentation@nestjs/bullmqandbullmq- queue/job instrumentation@nestjs/schedule- scheduled job (@Cron,@Interval,@Timeout) instrumentation
# unit tests
$ npm test
# integration tests (boot real Nest apps on real ports)
$ npm run test:intThe package ships as ESM only. CommonJS consumers can still require() it
through Node's require(esm) support, which is why the engine floor is
Node 20.19 (or 22.12) rather than 20.0 - and why nothing in the module graph
uses top-level await, which require(esm) cannot load.
// works from CommonJS on Node >= 20.19
const { createObserveModule } = require("@nestjs/observe");- Website - https://nestjs.com
- Twitter - @nestframework
Nest is MIT licensed.