Add the five Ledgerline application metrics
- ledgerline.transactions.total (counter: kind, status, currency) and ledgerline.transaction.duration (histogram, seconds: kind) in gateway, the only place that sees the final outcome, failures included. currency is client input, so values outside the seeded set are recorded as "other". - ledgerline.fraud.score (histogram, buckets in 0.1 steps to 1.0) in fraud. - ledgerline.stream.lag (observable gauge: consumer_group) in audit and notifier, read from XINFO GROUPS through a separate sync Redis client, because callbacks run on the scrape thread; the call is untraced so scrapes don't create traces. - ledgerline.db.pool.in_use (observable up-down counter: pool) in every service with a DB engine. The SQLAlchemy instrumentation's own pool metric names a pool by DSN, which merges the normal and starved engines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
7cb3231226
commit
920712f32b
@@ -2,7 +2,7 @@ import httpx
|
||||
from fastapi import FastAPI, Request
|
||||
from fastapi.responses import JSONResponse
|
||||
from pydantic import BaseModel
|
||||
from opentelemetry import trace
|
||||
from opentelemetry import metrics, trace
|
||||
from opentelemetry.trace import StatusCode
|
||||
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
|
||||
|
||||
@@ -27,6 +27,13 @@ FastAPIInstrumentor.instrument_app(
|
||||
exclude_spans=["receive", "send"],
|
||||
)
|
||||
|
||||
meter = metrics.get_meter(__name__)
|
||||
fraud_score = meter.create_histogram(
|
||||
"ledgerline.fraud.score",
|
||||
description="Risk score per scoring call (0-1; gateway rejects above 0.8)",
|
||||
explicit_bucket_boundaries_advisory=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
|
||||
)
|
||||
|
||||
|
||||
class ScoreRequest(BaseModel):
|
||||
account_id: str
|
||||
@@ -110,6 +117,7 @@ async def score_transaction(body: ScoreRequest):
|
||||
risk_score = score(body.category_id, matched)
|
||||
span.set_attribute("ledgerline.sanctions.matched", matched)
|
||||
span.set_attribute("ledgerline.risk.score", risk_score)
|
||||
fraud_score.record(risk_score)
|
||||
logger.info(
|
||||
"transaction_scored", account_id=body.account_id, risk_score=risk_score, matched=matched
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user