Skip to content

Instantly share code, notes, and snippets.

@jessitron
Created June 2, 2022 23:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jessitron/6ef5c8e5e622faedc9937973b2a3cefe to your computer and use it in GitHub Desktop.
Save jessitron/6ef5c8e5e622faedc9937973b2a3cefe to your computer and use it in GitHub Desktop.
Send Node.js instrumentation to Honeycomb
{ ...
"dependencies": {
"@grpc/grpc-js": "^1.5.7",
"@opentelemetry/api": "^1.1.0",
"@opentelemetry/core": "^1.1.1",
"@opentelemetry/exporter-trace-otlp-grpc": "^0.27.0",
"@opentelemetry/instrumentation": "^0.27.0",
"@opentelemetry/instrumentation-express": "^0.28.0",
"@opentelemetry/instrumentation-http": "^0.27.0",
"@opentelemetry/resources": "^1.1.1",
"@opentelemetry/sdk-trace-base": "^1.1.1",
"@opentelemetry/sdk-trace-node": "^1.1.1",
"@opentelemetry/semantic-conventions": "^1.1.0"
},
}
const { DiagConsoleLogger, DiagLogLevel, diag } = require("@opentelemetry/api");
//diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
// import otel dependencies
const opentelemetry = require("@opentelemetry/api");
const { ConsoleLogger } = require("@opentelemetry/core");
const { NodeTracerProvider } = require("@opentelemetry/sdk-trace-node");
const {
SimpleSpanProcessor,
ConsoleSpanExporter,
BatchSpanProcessor
} = require("@opentelemetry/sdk-trace-base");
const { HttpInstrumentation } = require("@opentelemetry/instrumentation-http");
const {
ExpressInstrumentation
} = require("@opentelemetry/instrumentation-express");
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
const { registerInstrumentations } = require("@opentelemetry/instrumentation");
const grpc = require("@grpc/grpc-js");
const { Resource } = require('@opentelemetry/resources');
const { SemanticResourceAttributes } = require('@opentelemetry/semantic-conventions');
// set log level to DEBUG for a lot of output
opentelemetry.diag.setLogger(new opentelemetry.DiagConsoleLogger(), opentelemetry.DiagLogLevel.INFO);
const apikey = process.env.HONEYCOMB_API_KEY;
const serviceName = process.env.SERVICE_NAME || 'sequence-of-numbers';
console.log(`Exporting to Honeycomb with APIKEY <${apikey}> and service name ${serviceName}`)
const provider = new NodeTracerProvider({
resource: new Resource({
[SemanticResourceAttributes.SERVICE_NAME]: serviceName
}),
});
const metadata = new grpc.Metadata();
metadata.set("x-honeycomb-team", apikey);
const creds = grpc.credentials.createSsl();
provider.addSpanProcessor(
new BatchSpanProcessor(
new OTLPTraceExporter({
url: "grpc://api.honeycomb.io:443/",
credentials: creds,
metadata
}), { scheduledDelayMillis: 500, maxQueueSize: 16000, maxExportBatchSize: 1000 }
)
);
// uncomment this to see traces in stdout
//provider.addSpanProcessor(new BatchSpanProcessor(new ConsoleSpanExporter()));
provider.register();
// turn on autoinstrumentation for traces you're likely to want
registerInstrumentations({
tracerProvider: provider,
instrumentations: [new HttpInstrumentation(), new ExpressInstrumentation()]
});
process.on("SIGINT", async () => {
console.log("Flushing telemetry");
await provider.activeSpanProcessor.forceFlush();
console.log("Flushed");
process.exit();
});
@jessitron
Copy link
Author

Install the dependencies; create your tracing.js file; define HONEYCOMB_API_KEY and SERVICE_NAME; and then add -r ./tracing.js to the node command that starts your app.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment