feat: harmonize log and metrics
This commit is contained in:
@@ -1,21 +1,12 @@
|
||||
import { metrics, trace, type Tracer } from "@opentelemetry/api"
|
||||
import { trace, type Tracer } from "@opentelemetry/api"
|
||||
|
||||
import { env } from "@/env/server"
|
||||
import { createCounter } from "@/server/telemetry"
|
||||
|
||||
import { getCacheClient } from "@/services/dataCache"
|
||||
|
||||
import type { ServiceTokenResponse } from "@/types/tokens"
|
||||
|
||||
// OpenTelemetry metrics: Service token
|
||||
const meter = metrics.getMeter("trpc.context.serviceToken")
|
||||
const fetchServiceTokenCounter = meter.createCounter(
|
||||
"trpc.context.serviceToken.fetch-new-token"
|
||||
)
|
||||
|
||||
const fetchServiceTokenFailCounter = meter.createCounter(
|
||||
"trpc.context.serviceToken.fetch-fail"
|
||||
)
|
||||
|
||||
export async function getServiceToken() {
|
||||
const tracer = trace.getTracer("getServiceToken")
|
||||
|
||||
@@ -62,15 +53,32 @@ async function getOrSetServiceTokenFromCache(
|
||||
}
|
||||
|
||||
async function getJwt(scopes: string[]) {
|
||||
fetchServiceTokenCounter.add(1)
|
||||
const getJwtCounter = createCounter("tokenManager", "getJwt")
|
||||
const metricsGetJwt = getJwtCounter.init({
|
||||
scopes,
|
||||
})
|
||||
|
||||
metricsGetJwt.start()
|
||||
|
||||
const jwt = await fetchServiceToken(scopes)
|
||||
|
||||
const expiresAt = Date.now() + jwt.expires_in * 1000
|
||||
|
||||
metricsGetJwt.success()
|
||||
|
||||
return { expiresAt, jwt }
|
||||
}
|
||||
|
||||
async function fetchServiceToken(scopes: string[]) {
|
||||
fetchServiceTokenCounter.add(1)
|
||||
const fetchServiceTokenCounter = createCounter(
|
||||
"tokenManager",
|
||||
"fetchServiceToken"
|
||||
)
|
||||
const metricsFetchServiceToken = fetchServiceTokenCounter.init({
|
||||
scopes,
|
||||
})
|
||||
|
||||
metricsFetchServiceToken.start()
|
||||
|
||||
const response = await fetch(`${env.CURITY_ISSUER_USER}/oauth/v2/token`, {
|
||||
method: "POST",
|
||||
@@ -87,36 +95,23 @@ async function fetchServiceToken(scopes: string[]) {
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
await metricsFetchServiceToken.httpError(response)
|
||||
|
||||
const text = await response.text()
|
||||
const error = {
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
text,
|
||||
}
|
||||
|
||||
fetchServiceTokenFailCounter.add(1, {
|
||||
error_type: "http_error",
|
||||
error: JSON.stringify(error),
|
||||
})
|
||||
|
||||
console.error(
|
||||
"fetchServiceToken error",
|
||||
JSON.stringify({
|
||||
query: {
|
||||
grant_type: "client_credentials",
|
||||
client_id: env.CURITY_CLIENT_ID_SERVICE,
|
||||
scope: scopes.join(" "),
|
||||
},
|
||||
error,
|
||||
})
|
||||
)
|
||||
|
||||
throw new Error(
|
||||
`[fetchServiceToken] Failed to obtain service token: ${JSON.stringify(error)}`
|
||||
`[fetchServiceToken] Failed to obtain service token: ${JSON.stringify({
|
||||
status: response.status,
|
||||
statusText: response.statusText,
|
||||
text,
|
||||
})}`
|
||||
)
|
||||
}
|
||||
|
||||
return response.json() as Promise<ServiceTokenResponse>
|
||||
const result = response.json() as Promise<ServiceTokenResponse>
|
||||
|
||||
metricsFetchServiceToken.success()
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
function getServiceTokenCacheKey(scopes: string[]): string {
|
||||
|
||||
Reference in New Issue
Block a user