Skip to content

Instantly share code, notes, and snippets.

@brbarmex
Created September 23, 2025 14:37
Show Gist options
  • Select an option

  • Save brbarmex/76b553491b194d9d422c775a6fdea071 to your computer and use it in GitHub Desktop.

Select an option

Save brbarmex/76b553491b194d9d422c775a6fdea071 to your computer and use it in GitHub Desktop.
dd
{
"title": "HTTP Golden Signals - Gin API",
"description": "Golden Signals (latência, tráfego, erros, saturação, apdex) para serviços HTTP instrumentados com Gin + Datadog (dd-trace-go v2 + datadog-go v5).",
"layout_type": "ordered",
"is_read_only": false,
"notify_list": [],
"reflow_type": "auto",
"template_variables": [
{ "name": "service", "prefix": "service", "default": "my-gin-api" },
{ "name": "env", "prefix": "env", "default": "perf" },
{ "name": "route", "prefix": "route", "default": "*" }
],
"widgets": [
{
"definition": {
"type": "note",
"content": "# HTTP Golden Signals\n- **Filtre** por `service`, `env` e `route` usando as variáveis acima.\n- Métricas esperadas: `http.server.requests`, `http.server.request_duration_ms` (Distribution), `http.server.errors`, `http.server.in_flight`, `http.server.bytes_out`, `http.server.queue_time_ms`, `http.server.apdex_*`.",
"background_color": "blue",
"font_size": "14",
"text_align": "left",
"show_tick": true,
"tick_pos": "50%"
}
},
{
"definition": {
"title": "Latência p95 (ms)",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "query_p95" }],
"queries": [
{
"name": "query_p95",
"data_source": "metrics",
"query": "p95:http.server.request_duration_ms{service:$service,env:$env,route:$route}"
}
],
"response_format": "timeseries",
"display_type": "line"
}
],
"yaxis": { "scale": "linear" }
}
},
{
"definition": {
"title": "RPS (Requests/s)",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "q_rps" }],
"queries": [
{
"name": "q_rps",
"data_source": "metrics",
"query": "sum:http.server.requests{service:$service,env:$env,route:$route}.as_rate()"
}
],
"response_format": "timeseries",
"display_type": "line"
}
],
"yaxis": { "scale": "linear" }
}
},
{
"definition": {
"title": "Error rate (%)",
"type": "timeseries",
"requests": [
{
"formulas": [
{ "formula": "(q_err / q_req) * 100" }
],
"queries": [
{
"name": "q_err",
"data_source": "metrics",
"query": "sum:http.server.errors{service:$service,env:$env,route:$route}.as_rate()"
},
{
"name": "q_req",
"data_source": "metrics",
"query": "sum:http.server.requests{service:$service,env:$env,route:$route}.as_rate()"
}
],
"response_format": "timeseries",
"display_type": "line"
}
],
"yaxis": { "scale": "linear", "include_zero": true, "min": "auto", "max": "auto" }
}
},
{
"definition": {
"title": "Saturação - In-flight (reqs concorrentes)",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "q_inflight" }],
"queries": [
{
"name": "q_inflight",
"data_source": "metrics",
"query": "avg:http.server.in_flight{service:$service,env:$env,route:$route}"
}
],
"response_format": "timeseries",
"display_type": "line"
}
]
}
},
{
"definition": {
"title": "Throughput - Bytes/s (out)",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "q_bps_out" }],
"queries": [
{
"name": "q_bps_out",
"data_source": "metrics",
"query": "sum:http.server.bytes_out{service:$service,env:$env,route:$route}.as_rate()"
}
],
"response_format": "timeseries",
"display_type": "line"
}
]
}
},
{
"definition": {
"title": "Queue time p95 (ms) - opcional",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "q_p95_queue" }],
"queries": [
{
"name": "q_p95_queue",
"data_source": "metrics",
"query": "p95:http.server.queue_time_ms{service:$service,env:$env,route:$route}"
}
],
"response_format": "timeseries",
"display_type": "line"
}
]
}
},
{
"definition": {
"title": "Apdex (0–1)",
"type": "query_value",
"requests": [
{
"formulas": [
{ "formula": "(q_sat + (q_tol * 0.5)) / (q_sat + q_tol + q_fru)" }
],
"queries": [
{
"name": "q_sat",
"data_source": "metrics",
"query": "sum:http.server.apdex_satisfying{service:$service,env:$env,route:$route}.rollup(sum, 300)"
},
{
"name": "q_tol",
"data_source": "metrics",
"query": "sum:http.server.apdex_tolerating{service:$service,env:$env,route:$route}.rollup(sum, 300)"
},
{
"name": "q_fru",
"data_source": "metrics",
"query": "sum:http.server.apdex_frustrated{service:$service,env:$env,route:$route}.rollup(sum, 300)"
}
],
"response_format": "scalar"
}
],
"autoscale": true,
"custom_unit": "",
"precision": 3
}
},
{
"definition": {
"title": "Latência por rota (p95) — split por {route}",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "q_lat_split" }],
"queries": [
{
"name": "q_lat_split",
"data_source": "metrics",
"query": "p95:http.server.request_duration_ms{service:$service,env:$env} by {route}"
}
],
"response_format": "timeseries",
"display_type": "line"
}
]
}
},
{
"definition": {
"title": "TOP rotas por latência p95 (ms)",
"type": "toplist",
"requests": [
{
"queries": [
{
"name": "q_top_p95",
"data_source": "metrics",
"query": "p95:http.server.request_duration_ms{service:$service,env:$env} by {route}"
}
]
}
]
}
},
{
"definition": {
"title": "Distribuição de status (rate por família)",
"type": "timeseries",
"requests": [
{
"formulas": [{ "formula": "q_2xx" }],
"queries": [
{
"name": "q_2xx",
"data_source": "metrics",
"query": "sum:http.server.requests{service:$service,env:$env,route:$route,status:2*}.as_rate()"
}
],
"display_type": "area",
"response_format": "timeseries"
},
{
"formulas": [{ "formula": "q_4xx" }],
"queries": [
{
"name": "q_4xx",
"data_source": "metrics",
"query": "sum:http.server.requests{service:$service,env:$env,route:$route,status:4*}.as_rate()"
}
],
"display_type": "area",
"response_format": "timeseries"
},
{
"formulas": [{ "formula": "q_5xx" }],
"queries": [
{
"name": "q_5xx",
"data_source": "metrics",
"query": "sum:http.server.requests{service:$service,env:$env,route:$route,status:5*}.as_rate()"
}
],
"display_type": "area",
"response_format": "timeseries"
}
],
"yaxis": { "scale": "linear", "include_zero": true }
}
}
],
"tags": ["golden-signals", "http", "gin", "datadog", "perf"],
"id": null
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment