Skip to content

Commit a70b760

Browse files
authored
Update express example to include route filtering (open-telemetry#652)
Fixes open-telemetry#651
1 parent 5fb3313 commit a70b760

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

examples/express/server.js

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const authMiddleware = (req, res, next) => {
3232
};
3333

3434
app.use(express.json());
35+
app.get('/health', (req, res) => res.status(200).send("HEALTHY")); // endpoint that is called by framework/cluster
3536
app.get('/run_test', async (req, res) => {
3637
// Calls another endpoint of the same API, somewhat mimicing an external API call
3738
const createdCat = await axios.post(`http://localhost:${PORT}/cats`, {

examples/express/tracer.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ const opentelemetry = require('@opentelemetry/api');
66
const { diag, DiagConsoleLogger, DiagLogLevel } = opentelemetry;
77
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);
88

9+
const { AlwaysOnSampler } = require('@opentelemetry/core');
910
const { registerInstrumentations } = require('@opentelemetry/instrumentation');
1011
const { NodeTracerProvider } = require('@opentelemetry/sdk-trace-node');
1112
const { SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-base');
1213
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');
1314
const { ZipkinExporter } = require('@opentelemetry/exporter-zipkin');
1415
const { Resource } = require('@opentelemetry/resources');
15-
const { SemanticResourceAttributes: ResourceAttributesSC } = require('@opentelemetry/semantic-conventions');
16+
const { SemanticAttributes, SemanticResourceAttributes: ResourceAttributesSC } = require('@opentelemetry/semantic-conventions');
1617

1718
const Exporter = (process.env.EXPORTER || '')
1819
.toLowerCase().startsWith('z') ? ZipkinExporter : JaegerExporter;
@@ -24,6 +25,7 @@ module.exports = (serviceName) => {
2425
resource: new Resource({
2526
[ResourceAttributesSC.SERVICE_NAME]: serviceName,
2627
}),
28+
sampler: filterSampler(ignoreHealthCheck, new AlwaysOnSampler()),
2729
});
2830
registerInstrumentations({
2931
tracerProvider: provider,
@@ -45,3 +47,21 @@ module.exports = (serviceName) => {
4547

4648
return opentelemetry.trace.getTracer('express-example');
4749
};
50+
51+
function filterSampler(filterFn, parent) {
52+
return {
53+
shouldSample(ctx, tid, spanName, spanKind, attr, links) {
54+
if (!filterFn(spanName, spanKind, attr)) {
55+
return { decision: opentelemetry.SamplingDecision.NOT_RECORD };
56+
}
57+
return parent.shouldSample(ctx, tid, name, kind, attr, links);
58+
},
59+
toString() {
60+
return `FilterSampler(${parent.toString()})`;
61+
}
62+
}
63+
}
64+
65+
function ignoreHealthCheck(spanName, spanKind, attributes) {
66+
return spanKind !== opentelemetry.SpanKind.SERVER || attributes[SemanticAttributes.HTTP_ROUTE] !== "/health";
67+
}

0 commit comments

Comments
 (0)