Skip to content

Commit 9cd80ee

Browse files
authored
Merge pull request #402 from vtex/feat/jaeger-prometheus-metrics
Add Jaeger Prometheus metrics
2 parents 1a5946d + cb24b91 commit 9cd80ee

4 files changed

Lines changed: 43 additions & 7 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
77

88
## [Unreleased]
99

10+
## [6.35.1] - 2020-07-22
11+
### Added
12+
- [metrics] Export jaeger metrics.
13+
14+
### Fixed
15+
- [metrics] Typo on event listened to increment `runtime_http_aborted_requests_total`.
16+
- [tracing:entrypoint] Fix waiting for response stream to finish.
17+
1018
## [6.35.0] - 2020-07-08
1119
### Added
1220
- [metrics] Create new Prometheus exported metrics:

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@vtex/api",
3-
"version": "6.35.0",
3+
"version": "6.35.1",
44
"description": "VTEX I/O API client",
55
"main": "lib/index.js",
66
"typings": "lib/index.d.ts",

src/service/tracing/TracerSingleton.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import { initTracer as initJaegerTracer, TracingConfig, TracingOptions } from 'jaeger-client'
1+
import { initTracer as initJaegerTracer, PrometheusMetricsFactory, TracingConfig, TracingOptions } from 'jaeger-client'
22
import { Tracer } from 'opentracing'
3+
import promClient from 'prom-client'
34
import { APP, LINKED, NODE_ENV, NODE_VTEX_API_VERSION, PRODUCTION, REGION, WORKSPACE } from '../../constants'
45
import { AppTags } from '../../tracing/Tags'
56
import { appIdToAppAtMajor } from '../../utils'
@@ -42,6 +43,13 @@ export class TracerSingleton {
4243
}
4344

4445
const options: TracingOptions = {
46+
/**
47+
* Jaeger metric names are available in:
48+
* https://github.com/jaegertracing/jaeger-client-node/blob/master/src/metrics/metrics.js
49+
*
50+
* Runtime will prefix these metrics with 'runtime:'
51+
*/
52+
metrics: new PrometheusMetricsFactory(promClient as any, 'runtime'),
4553
tags: defaultTags,
4654
}
4755

src/service/tracing/tracingMiddlewares.ts

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,20 @@ export const addTracingMiddleware = (tracer: Tracer) => {
3838
}
3939

4040
const rootSpan = tracer.extract(FORMAT_HTTP_HEADERS, ctx.request.headers) as undefined | SpanContext
41-
const currentSpan = tracer.startSpan('unknown-operation', { childOf: rootSpan })
41+
const currentSpan = tracer.startSpan('unknown-operation', {
42+
childOf: rootSpan,
43+
tags: { [OpentracingTags.SPAN_KIND]: OpentracingTags.SPAN_KIND_RPC_SERVER },
44+
})
45+
46+
const initialSamplingDecision = getTraceInfo(currentSpan).isSampled
47+
4248
ctx.tracing = { currentSpan, tracer }
43-
ctx.req.once('abort', () => abortedRequests.inc({ [MetricLabels.REQUEST_HANDLER]: (currentSpan as any).operationName as string }, 1))
49+
ctx.req.once('aborted', () =>
50+
abortedRequests.inc({ [MetricLabels.REQUEST_HANDLER]: (currentSpan as any).operationName as string }, 1)
51+
)
52+
53+
let responseClosed = false
54+
ctx.res.once('close', () => (responseClosed = true))
4455

4556
try {
4657
await next()
@@ -66,8 +77,11 @@ export const addTracingMiddleware = (tracer: Tracer) => {
6677

6778
const traceInfo = getTraceInfo(currentSpan)
6879
if (traceInfo.isSampled) {
80+
if (!initialSamplingDecision) {
81+
currentSpan.setTag(OpentracingTags.SPAN_KIND, OpentracingTags.SPAN_KIND_RPC_SERVER)
82+
}
83+
6984
currentSpan.addTags({
70-
[OpentracingTags.SPAN_KIND]: OpentracingTags.SPAN_KIND_RPC_SERVER,
7185
[OpentracingTags.HTTP_URL]: ctx.request.href,
7286
[OpentracingTags.HTTP_METHOD]: ctx.request.method,
7387
[OpentracingTags.HTTP_STATUS_CODE]: ctx.response.status,
@@ -82,17 +96,23 @@ export const addTracingMiddleware = (tracer: Tracer) => {
8296
ctx.set(TRACE_ID_HEADER, traceInfo.traceId)
8397
}
8498

85-
onStreamFinished(ctx.res, () => {
99+
const onResFinished = () => {
86100
requestTimings.observe(
87101
{
88102
[MetricLabels.REQUEST_HANDLER]: (currentSpan as any).operationName as string,
89103
},
90104
hrToMillisFloat(process.hrtime(start))
91105
)
106+
92107
concurrentRequests.dec(1)
93108
currentSpan.finish()
94-
})
109+
}
95110

111+
if (responseClosed) {
112+
onResFinished()
113+
} else {
114+
onStreamFinished(ctx.res, onResFinished)
115+
}
96116
}
97117
}
98118
}

0 commit comments

Comments
 (0)