@@ -6,13 +6,14 @@ const opentelemetry = require('@opentelemetry/api');
6
6
const { diag, DiagConsoleLogger, DiagLogLevel } = opentelemetry ;
7
7
diag . setLogger ( new DiagConsoleLogger ( ) , DiagLogLevel . INFO ) ;
8
8
9
+ const { AlwaysOnSampler } = require ( '@opentelemetry/core' ) ;
9
10
const { registerInstrumentations } = require ( '@opentelemetry/instrumentation' ) ;
10
11
const { NodeTracerProvider } = require ( '@opentelemetry/sdk-trace-node' ) ;
11
12
const { SimpleSpanProcessor } = require ( '@opentelemetry/sdk-trace-base' ) ;
12
13
const { JaegerExporter } = require ( '@opentelemetry/exporter-jaeger' ) ;
13
14
const { ZipkinExporter } = require ( '@opentelemetry/exporter-zipkin' ) ;
14
15
const { Resource } = require ( '@opentelemetry/resources' ) ;
15
- const { SemanticResourceAttributes : ResourceAttributesSC } = require ( '@opentelemetry/semantic-conventions' ) ;
16
+ const { SemanticAttributes , SemanticResourceAttributes : ResourceAttributesSC } = require ( '@opentelemetry/semantic-conventions' ) ;
16
17
17
18
const Exporter = ( process . env . EXPORTER || '' )
18
19
. toLowerCase ( ) . startsWith ( 'z' ) ? ZipkinExporter : JaegerExporter ;
@@ -24,6 +25,7 @@ module.exports = (serviceName) => {
24
25
resource : new Resource ( {
25
26
[ ResourceAttributesSC . SERVICE_NAME ] : serviceName ,
26
27
} ) ,
28
+ sampler : filterSampler ( ignoreHealthCheck , new AlwaysOnSampler ( ) ) ,
27
29
} ) ;
28
30
registerInstrumentations ( {
29
31
tracerProvider : provider ,
@@ -45,3 +47,21 @@ module.exports = (serviceName) => {
45
47
46
48
return opentelemetry . trace . getTracer ( 'express-example' ) ;
47
49
} ;
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