Skip to content

Commit

Permalink
use the tracer and pass ctx
Browse files Browse the repository at this point in the history
  • Loading branch information
mojotalantikite committed May 15, 2024
1 parent edf2f8e commit bef4be9
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 80 deletions.
2 changes: 1 addition & 1 deletion .envrc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export PARAMETER_STORE_MODE='LOCAL'
export ALLOWED_IP_ADDRESSES='127.0.0.1'
export JWT_SECRET='3fd2e448ed2cec1fa46520f1b64bcb243c784f68db41ea67ef9abc45c12951d3e770162829103c439f01d2b860d06ed0da1a08895117b1ef338f1e4ed176448a' # pragma: allowlist secret

export REACT_APP_OTEL_COLLECTOR_URL='http://localhost:4318/v1/traces'
export REACT_APP_OTEL_COLLECTOR_URL='http://localhost:3030/local/otel'
export REACT_APP_LD_CLIENT_ID='this-value-can-be-set-in-local-if-desired'

# Sources a local overrides file. You can export any variables you
Expand Down
61 changes: 13 additions & 48 deletions services/app-api/src/handlers/apollo_gql.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Span, Tracer } from '@opentelemetry/api'
import { propagation, ROOT_CONTEXT, SpanKind } from '@opentelemetry/api'
import type { Context as OTELContext, Span, Tracer } from '@opentelemetry/api'
import { propagation, ROOT_CONTEXT } from '@opentelemetry/api'
import { ApolloServer } from 'apollo-server-lambda'
import type {
APIGatewayProxyEvent,
Expand All @@ -20,7 +20,6 @@ import { NewPostgresStore } from '../postgres/postgresStore'
import { configureResolvers } from '../resolvers'
import { configurePostgres } from './configuration'
import { createTracer } from '../otel/otel_handler'
import { SemanticAttributes } from '@opentelemetry/semantic-conventions'
import {
newAWSEmailParameterStore,
newLocalEmailParameterStore,
Expand All @@ -29,21 +28,20 @@ import type { LDService } from '../launchDarkly/launchDarkly'
import { ldService, offlineLDService } from '../launchDarkly/launchDarkly'
import type { LDClient } from '@launchdarkly/node-server-sdk'
import * as ld from '@launchdarkly/node-server-sdk'
import { newJWTLib } from '../jwt'
import {
ApolloServerPluginLandingPageLocalDefault,
ApolloServerPluginLandingPageDisabled,
ApolloServerPluginLandingPageLocalDefault,
} from 'apollo-server-core'
import { newJWTLib } from '../jwt'

const requestSpanKey = 'REQUEST_SPAN'
let tracer: Tracer

let ldClient: LDClient

// The Context type passed to all of our GraphQL resolvers
export interface Context {
user: UserType
span?: Span
tracer?: Tracer
ctx?: OTELContext
}

// This function pulls auth info out of the cognitoAuthenticationProvider in the lambda event
Expand All @@ -57,9 +55,10 @@ function contextForRequestForFetcher(userFetcher: userFromAuthProvider): ({
}) => Promise<Context> {
return async ({ event, context }) => {
// pull the current span out of the LAMBDA context, to place it in the APOLLO context
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const anyContext = context as any
const requestSpan = anyContext[requestSpanKey]
const stageName = process.env.stage
const tracer = createTracer('app-api-' + stageName)
const ctx = propagation.extract(ROOT_CONTEXT, event.headers)

const authProvider =
event.requestContext.identity.cognitoAuthenticationProvider
// This handler is shared with the third_party_API_authorizer
Expand Down Expand Up @@ -104,7 +103,8 @@ function contextForRequestForFetcher(userFetcher: userFromAuthProvider): ({
if (!userResult.isErr()) {
return {
user: userResult.value,
span: requestSpan,
tracer: tracer,
ctx: ctx,
}
} else {
throw new Error(
Expand Down Expand Up @@ -179,37 +179,6 @@ function ipRestrictionMiddleware(
}
}

// Tracing Middleware
function tracingMiddleware(wrapped: Handler): Handler {
return async function (event, context, completion) {
// get the parent context from headers
const ctx = propagation.extract(ROOT_CONTEXT, event.headers)
const span = tracer.startSpan(
'handleRequest',
{
kind: SpanKind.SERVER,
attributes: {
[SemanticAttributes.AWS_LAMBDA_INVOKED_ARN]:
context.invokedFunctionArn,
},
},
ctx
)

// Put the span into the LAMBDA context, in order to pass it into the APOLLO context in contextForRequestForFetcher
// We have to use any here because this context's type is not under our control.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const anyContext = context as any
anyContext[requestSpanKey] = span

const result = await wrapped(event, context, completion)

span.end()

return result
}
}

// This asynchronous function is started on the cold-load of this script
// and is awaited by our handler function
// Pattern is explained here https://serverlessfirst.com/function-initialisation/
Expand Down Expand Up @@ -452,11 +421,7 @@ async function initializeGQLHandler(): Promise<Handler> {
},
})

// init tracer and set the middleware. tracer needs to be global.
tracer = createTracer('app-api-' + stageName)
const combinedHandler = ipRestrictionMiddleware(allowedIpAddresses)(
tracingMiddleware(handler)
)
const combinedHandler = ipRestrictionMiddleware(allowedIpAddresses)(handler)

// Locally, we wrap our handler in a middleware that returns 403 for unauthenticated requests
const isLocal = authMode === 'LOCAL'
Expand Down
2 changes: 1 addition & 1 deletion services/app-api/src/otel/otel_handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export function createTracer(serviceName: string): Tracer {

// log to console and send to New Relic
const exporter = new OTLPTraceExporter({
url: process.env.REACT_APP_OTEL_COLLECTOR_URL,
url: 'http://localhost:4318/v1/traces', //process.env.REACT_APP_OTEL_COLLECTOR_URL,
headers: {},
})

Expand Down
2 changes: 2 additions & 0 deletions services/app-api/src/resolvers/attributeHelper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,13 @@ export function setErrorAttributesOnActiveSpan(
message: message,
code: SpanStatusCode.ERROR,
})
span.end()
}

export function setSuccessAttributesOnActiveSpan(span: Context['span']): void {
if (!span) return
span.setAttributes({
'graphql.operation.success': true,
})
span.end()
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,15 @@ export function updateHealthPlanFormDataResolver(
launchDarkly: LDService
): MutationResolvers['updateHealthPlanFormData'] {
return async (_parent, { input }, context) => {
const { user, span } = context
const { user, ctx } = context
const tracer = context.tracer

// Create a new span for this resolver operation
const span = tracer?.startSpan(
'updateHealthPlanFormDataResolver',
{},
ctx
)
setResolverDetailsOnActiveSpan('updateHealthPlanFormData', user, span)

const featureFlags = await launchDarkly.allFlags(context)
Expand Down
2 changes: 2 additions & 0 deletions services/app-web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@
"@cypress/instrument-cra": "^1.4.0",
"@opentelemetry/api": "^1.6.0",
"@opentelemetry/auto-instrumentations-web": "^0.34.0",
"@opentelemetry/context-zone": "^1.24.1",
"@opentelemetry/exporter-collector": "^0.25.0",
"@opentelemetry/exporter-trace-otlp-http": "^0.45.1",
"@opentelemetry/id-generator-aws-xray": "^1.2.1",
"@opentelemetry/instrumentation": "^0.45.1",
Expand Down
5 changes: 4 additions & 1 deletion services/app-web/src/contexts/TraceContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ registerInstrumentations({
/(.*)\.adoberesources\.net/g,
/(.*)\.google-analytics\.com/g,
],
propagateTraceHeaderCorsUrls: [/.+/g],
//propagateTraceHeaderCorsUrls: [/.+/g],
propagateTraceHeaderCorsUrls: [
new RegExp('http://localhost:3000'),
],
},
}),
],
Expand Down
108 changes: 80 additions & 28 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -8769,6 +8769,11 @@
dependencies:
"@opentelemetry/api" "^1.0.0"

"@opentelemetry/api-metrics@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/api-metrics/-/api-metrics-0.25.0.tgz#3b996842c8043068da4d11a6e96960e757ad6be9"
integrity sha512-9T0c9NQAEGRujUC7HzPa2/qZ5px/UvB2sfSU5CAKFRrAlDl2gn25B0oUbDqSRHW/IG1X2rnQ3z2bBQkJyJvE4g==

"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.6.0":
version "1.7.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.7.0.tgz#b139c81999c23e3c8d3c0a7234480e945920fc40"
Expand All @@ -8795,6 +8800,27 @@
resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.19.0.tgz#86406105280d428f99afccd65b092ad4a3540347"
integrity sha512-0i1ECOc9daKK3rjUgDDXf0GDD5XfCou5lXnt2DALIc2qKoruPPcesobNKE54laSVUWnC3jX26RzuOa31g0V32A==

"@opentelemetry/context-zone-peer-dep@1.24.1":
version "1.24.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone-peer-dep/-/context-zone-peer-dep-1.24.1.tgz#400badb0390dc5f1344d489627690cc4855144ec"
integrity sha512-s67becvBZFFjSLKSiy8ia2m7htsC4gsk8J/X0368FzBYseb/26daYr4ewx6tKcAsmZqJA7402cTQirv175x5BA==

"@opentelemetry/context-zone@^1.24.1":
version "1.24.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/context-zone/-/context-zone-1.24.1.tgz#c0bc4c02a016e5e936c35b7e4766e648c087b462"
integrity sha512-pt5KLJws1m+rHTeEA6uootoyiuZlCt7j90dmdjXnqx4JZH6sFWqWB5IW1gOukDY7Ym3cNKjtoh3/uK0KuSRBfg==
dependencies:
"@opentelemetry/context-zone-peer-dep" "1.24.1"
zone.js "^0.11.0 || ^0.13.0 || ^0.14.0"

"@opentelemetry/core@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-0.25.0.tgz#44fae79865483be5dacdf72f99db9f1a603c4bae"
integrity sha512-8OTWF4vfCENU112XB5ElLqf0eq/FhsY0SBvvY65vB3+fbZ2Oi+CPsRASrUZWGtC9MJ5rK2lBlY+/jI4a/NPPBg==
dependencies:
"@opentelemetry/semantic-conventions" "0.25.0"
semver "^7.3.5"

"@opentelemetry/core@1.18.1":
version "1.18.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.18.1.tgz#d2e45f6bd6be4f00d20d18d4f1b230ec33805ae9"
Expand All @@ -8816,6 +8842,17 @@
dependencies:
"@opentelemetry/semantic-conventions" "1.9.0"

"@opentelemetry/exporter-collector@^0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-collector/-/exporter-collector-0.25.0.tgz#5c6a6a95cb2220aba6085f79b561166e150737df"
integrity sha512-xZYstLt4hz1aTloJaepWdjMMf9305MqwqbUWjcU/X9pOxvgFWRlchO6x/HQTw7ow0i/S+ShzC+greKnb+1WvLA==
dependencies:
"@opentelemetry/api-metrics" "0.25.0"
"@opentelemetry/core" "0.25.0"
"@opentelemetry/resources" "0.25.0"
"@opentelemetry/sdk-metrics-base" "0.25.0"
"@opentelemetry/sdk-trace-base" "0.25.0"

"@opentelemetry/exporter-metrics-otlp-http@^0.45.1":
version "0.45.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.45.1.tgz#322b66a7c17657e1d2c69b42535063bfcc2d992d"
Expand Down Expand Up @@ -9013,6 +9050,14 @@
dependencies:
"@opentelemetry/core" "1.19.0"

"@opentelemetry/resources@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-0.25.0.tgz#a780ab536577359ca9ebe93ccc5d02ba8c3fb2ce"
integrity sha512-O46u53vDBlxCML8O9dIjsRcCC2VT5ri1upwhp02ITobgJ16aVD/iScCo1lPl/x2E7yq9uwzMINENiiYZRFb6XA==
dependencies:
"@opentelemetry/core" "0.25.0"
"@opentelemetry/semantic-conventions" "0.25.0"

"@opentelemetry/resources@1.18.1":
version "1.18.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.18.1.tgz#e27bdc4715bccc8cd4a72d4aca3995ad0a496fe7"
Expand Down Expand Up @@ -9045,6 +9090,16 @@
"@opentelemetry/core" "1.18.1"
"@opentelemetry/resources" "1.18.1"

"@opentelemetry/sdk-metrics-base@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics-base/-/sdk-metrics-base-0.25.0.tgz#3ac340ef9f1ff7c649339bb031f6c390a2c8ed70"
integrity sha512-7fwPlAFB5Xw8mnVQfq0wqKNw3RXiAMad9T1bk5Sza9LK/L6hz8RTuHWCsFMsj+1OOSAaiPFuUMYrK1J75+2IAg==
dependencies:
"@opentelemetry/api-metrics" "0.25.0"
"@opentelemetry/core" "0.25.0"
"@opentelemetry/resources" "0.25.0"
lodash.merge "^4.6.2"

"@opentelemetry/sdk-metrics@1.18.1":
version "1.18.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-metrics/-/sdk-metrics-1.18.1.tgz#1dd334744a1e5d2eec27e9e9765c73cd2f43aef3"
Expand Down Expand Up @@ -9082,6 +9137,16 @@
"@opentelemetry/sdk-trace-node" "1.18.1"
"@opentelemetry/semantic-conventions" "1.18.1"

"@opentelemetry/sdk-trace-base@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-0.25.0.tgz#4393903a7db8a5ae81a99c4a34121df67e4fdfbe"
integrity sha512-TInkLSF/ThM3GNVM+9tgnCVjyNLnRxvAkG585Fhu0HNwaEtCTUwI0r7AvMRIREOreeRWttBG6kvT0LOKdo8yjw==
dependencies:
"@opentelemetry/core" "0.25.0"
"@opentelemetry/resources" "0.25.0"
"@opentelemetry/semantic-conventions" "0.25.0"
lodash.merge "^4.6.2"

"@opentelemetry/sdk-trace-base@1.18.1":
version "1.18.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.18.1.tgz#256605d90b202002d5672305c66dbcf377132379"
Expand Down Expand Up @@ -9160,6 +9225,11 @@
"@opentelemetry/sdk-trace-base" "1.9.0"
"@opentelemetry/semantic-conventions" "1.9.0"

"@opentelemetry/semantic-conventions@0.25.0":
version "0.25.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-0.25.0.tgz#c100d146957949608c6b9614267ae044cdcb5315"
integrity sha512-V3N+MDBiv0TUlorbgiSqk6CvcP876CYUk/41Tg6s8OIyvniTwprE6vPvFQayuABiVkGlHOxv1Mlvp0w4qNdnVg==

"@opentelemetry/semantic-conventions@1.18.1":
version "1.18.1"
resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.18.1.tgz#8e47caf57a84b1dcc1722b2025693348cdf443b4"
Expand Down Expand Up @@ -30681,16 +30751,7 @@ string-natural-compare@^3.0.1:
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==

"string-width-cjs@npm:string-width@^4.2.0":
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"

"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
Expand Down Expand Up @@ -30823,7 +30884,7 @@ stringify-object@^3.3.0:
is-obj "^1.0.1"
is-regexp "^1.0.0"

"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
Expand All @@ -30837,13 +30898,6 @@ strip-ansi@^3.0.1:
dependencies:
ansi-regex "^2.0.0"

strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"

strip-ansi@^7.0.1, strip-ansi@^7.1.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45"
Expand Down Expand Up @@ -33429,7 +33483,7 @@ worker-rpc@^0.1.0:
dependencies:
microevent.ts "~0.1.1"

"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
Expand All @@ -33447,15 +33501,6 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"

wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"

wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
Expand Down Expand Up @@ -33803,6 +33848,13 @@ zod@^3.10.1, zod@^3.11.6:
resolved "https://registry.yarnpkg.com/zod/-/zod-3.22.4.tgz#f31c3a9386f61b1f228af56faa9255e845cf3fff"
integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==

"zone.js@^0.11.0 || ^0.13.0 || ^0.14.0":
version "0.14.5"
resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.14.5.tgz#7f3591dc4cad1a030cda86b03d10450b719dd460"
integrity sha512-9XYWZzY6PhHOSdkYryNcMm7L8EK7a4q+GbTvxbIA2a9lMdRUpGuyaYvLDcg8D6bdn+JomSsbPcilVKg6SmUx6w==
dependencies:
tslib "^2.3.0"

zwitch@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
Expand Down

0 comments on commit bef4be9

Please sign in to comment.