Pembalakan & observabiliti
Kesemua tiga perkhidmatan (Web, MCP, CtraderCliNode) log melalui Serilog sebagai JSON ringkas pada stdout — masa jalan kontena dan pengumpul log (Loki, ELK, CloudWatch, Azure Log Analytics, Datadog) ingest peristiwa berstruktur secara langsung, tiada penghuraian teks bebas.
Salur
- Sink 1 — Konsol (JSON ringkas).
RenderedCompactJsonFormatter; setiap peristiwa membawa identiti OpenTelemetry sumber penuh —service.name(cmind-web/cmind-mcp/cmind-node-agent/cmind-copy-agent),service.version,service.namespace(cmind),deployment.environment— tambahtrace_id/span_iddaripadaActivityambient (ActivityEnricher) dan skopLogContext. ID trace membolehkan CloudWatch Logs Insights dan Azure Log Analytics berpusing log↔trace walaupun tiada pengumpul digunakan. - Sink 2 — OTLP (pilihan). Apabila
OTEL_EXPORTER_OTLP_ENDPOINTditetapkan, log juga export melalui OTLP dengan atribust yang sama, sebelah OpenTelemetry metrik dan trace (ASP.NET Core, HttpClient, pemprosesan masa jalan) daripadaAddAppTelemetry. - Sink 3 — Azure Monitor (pilihan). Apabila
APPLICATIONINSIGHTS_CONNECTION_STRINGditetapkan, trace dan metrik export secara asli ke Application Insights (AddAzureMonitorTraceExporter/AddAzureMonitorMetricExporter) — tiada pengumpul. Lihat bahagian asli awan di bawah. - Mesej dijana sumber. Log apl menggunakan
LogMessagessambungan taip strongly (Core/Logging/LogMessages.cs) denganEventIdyang stabil — tidak pernahILogger.LogInformationad-hoc. - Pembalakan permintaan.
UseSerilogRequestLogging()memancarkan satu ringkasan berstruktur setiap permintaan HTTP (kaedah, laluan, status, ms elapsed).
Konfigurasi
Tahap boleh ditala setiap perkhidmatan melalui bahagian Serilog dalam appsettings.json (dibaca melalui
ReadFrom.Configuration), cth:
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": { "Microsoft.AspNetCore": "Warning", "Microsoft.EntityFrameworkCore": "Warning" }
}
}
}
Override pada masa jalan dengan pembolehubah env, cth Serilog__MinimumLevel__Default=Debug.
Menghantar ke pengumpul
Tetapkan satu pembolehubah env setiap perkhidmatan, tunjuk ke titik akhir OTLP:
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
- Helm:
--set observability.otlpEndpoint=http://otel-collector:4317. - Compose / awan: tambah pembolehubah env kepada setiap perkhidmatan.
Dari pengumpul, edar kepada belakang (Tempo/Jaeger trace, Prometheus metrik, Loki log) dengan trace↔log correlation utuh.
Backend asli awan (tiada pengumpul tambahan)
Kedua-dua penempatan yang diintegrasi untuk tumpukan observabiliti asli keluar dari kotak — tiada pengumpul OTLP needed.
Azure — Application Insights + Log Analytics
deploy/azure/main.bicep memperuntukkan Application Insights komponen workspace-based, melewati
rentetan sambungannya kepada Web dan MCP sebagai APPLICATIONINSIGHTS_CONNECTION_STRING. Keputusan:
- Trace + metrik mengalir secara natively ke App Insights (Application Map, metrik langsung, gelintaran transaksi hujung-ke-hujung), dikolerasikan oleh
trace_id. - Log (JSON ringkas pada stdout) mendarat di ruang kerja Log Analytics yang sama melalui Container Apps
appLogsConfiguration, jadiAppTraces/ContainerAppConsoleLogs_CLbercantum pada trace id.
Tanya log dalam Log Analytics (baris JSON dalam Log_s):
ContainerAppConsoleLogs_CL
| extend log = parse_json(Log_s)
| where log.["service.name"] == "cmind-web"
| project TimeGenerated, level = log["@l"], msg = log["@m"], trace_id = log.trace_id
AWS — X-Ray + CloudWatch (ADOT sidecar)
deploy/aws/main.tf menjalankan AWS Distro for OpenTelemetry (ADOT) collector sebagai sidecar dalam setiap
tugas Fargate. Apl export OTLP ke http://localhost:4317; sidecar kapal:
- trace → AWS X-Ray (
awsxrayexporter), - metrik → CloudWatch (
awsemf, namespacecmind, kumpulan log/ecs/<prefix>/metrics). - Log kekal pada pemandu
awslogssebagai JSON ringkas; CloudWatch Logs Insights auto-mengesan JSON medan, jadi andafilter/statspadatrace_id,service.name,@l, dll.
Peranan tugas (aws_iam_role.task) membawa AWSXRayDaemonWriteAccess + CloudWatchAgentServerPolicy.
Tanya log dalam CloudWatch Logs Insights:
fields @timestamp, @l, @m, trace_id, `service.name`
| filter `service.name` = "cmind-web"
| sort @timestamp desc
Titik akhir kesihatan (juga digunakan oleh probe)
| Titik akhir | Perkhidmatan | Makna |
|---|---|---|
/alive | Web | Ketersediaan — proses sahaja. |
/health | Web | Kesediaan — termasuk semakan pangkalan data. |
/version | Web, MCP | Versi produk + protokol (Ketersediaan/m Bacaan MCP). |
Dipetakan dalam kesemua persekitaran (sebelum ini Dev sahaja) jadi probe Kubernetes dan awan berfungsi dalam pengeluaran.