2025-02-05 10:52:15 +01:00
|
|
|
import pkg/chronicles
|
|
|
|
|
import pkg/metrics
|
|
|
|
|
import pkg/metrics/chronos_httpserver
|
|
|
|
|
|
2025-02-11 14:02:30 +01:00
|
|
|
declareGauge(todoNodesGauge, "DHT nodes to be visited")
|
|
|
|
|
declareGauge(okNodesGauge, "DHT nodes successfully contacted")
|
|
|
|
|
declareGauge(nokNodesGauge, "DHT nodes failed to contact")
|
|
|
|
|
|
2025-03-20 16:20:37 +01:00
|
|
|
declareGauge(requestsGauge, "Marketplace active storage requests")
|
|
|
|
|
declareGauge(requestSlotsGauge, "Marketplace active storage request slots")
|
|
|
|
|
declareGauge(totalStorageSizeGauge, "Marketplace total bytes stored in active storage requests")
|
2025-03-18 15:54:55 +01:00
|
|
|
|
2025-02-11 14:02:30 +01:00
|
|
|
type
|
|
|
|
|
OnUpdateMetric = proc(value: int64): void {.gcsafe, raises: [].}
|
|
|
|
|
|
2025-02-11 14:29:41 +01:00
|
|
|
Metrics* = ref object of RootObj
|
2025-02-11 14:02:30 +01:00
|
|
|
todoNodes: OnUpdateMetric
|
|
|
|
|
okNodes: OnUpdateMetric
|
|
|
|
|
nokNodes: OnUpdateMetric
|
2025-03-20 16:20:37 +01:00
|
|
|
|
|
|
|
|
onRequests: OnUpdateMetric
|
|
|
|
|
onRequestSlots: OnUpdateMetric
|
|
|
|
|
onTotalSize: OnUpdateMetric
|
2025-02-11 14:02:30 +01:00
|
|
|
|
|
|
|
|
proc startServer(metricsAddress: IpAddress, metricsPort: Port) =
|
2025-02-05 10:52:15 +01:00
|
|
|
let metricsAddress = metricsAddress
|
|
|
|
|
notice "Starting metrics HTTP server",
|
|
|
|
|
url = "http://" & $metricsAddress & ":" & $metricsPort & "/metrics"
|
|
|
|
|
try:
|
|
|
|
|
startMetricsHttpServer($metricsAddress, metricsPort)
|
|
|
|
|
except CatchableError as exc:
|
|
|
|
|
raiseAssert exc.msg
|
|
|
|
|
except Exception as exc:
|
|
|
|
|
raiseAssert exc.msg # TODO fix metrics
|
2025-02-11 14:02:30 +01:00
|
|
|
|
2025-02-11 14:29:41 +01:00
|
|
|
method setTodoNodes*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
|
2025-02-11 14:02:30 +01:00
|
|
|
m.todoNodes(value.int64)
|
|
|
|
|
|
2025-02-11 14:29:41 +01:00
|
|
|
method setOkNodes*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
|
2025-02-11 14:02:30 +01:00
|
|
|
m.okNodes(value.int64)
|
|
|
|
|
|
2025-02-11 14:29:41 +01:00
|
|
|
method setNokNodes*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
|
2025-02-11 14:02:30 +01:00
|
|
|
m.nokNodes(value.int64)
|
|
|
|
|
|
2025-03-20 16:20:37 +01:00
|
|
|
method setRequests*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
|
|
|
|
|
m.onRequests(value.int64)
|
|
|
|
|
|
|
|
|
|
method setRequestSlots*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
|
|
|
|
|
m.onRequestSlots(value.int64)
|
|
|
|
|
|
|
|
|
|
method setTotalSize*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
|
|
|
|
|
m.onTotalSize(value.int64)
|
2025-03-18 15:54:55 +01:00
|
|
|
|
2025-02-11 14:02:30 +01:00
|
|
|
proc createMetrics*(metricsAddress: IpAddress, metricsPort: Port): Metrics =
|
|
|
|
|
startServer(metricsAddress, metricsPort)
|
|
|
|
|
|
|
|
|
|
# We can't extract this into a function because gauges cannot be passed as argument.
|
|
|
|
|
# The use of global state in nim-metrics is not pleasant.
|
|
|
|
|
proc onTodo(value: int64) =
|
|
|
|
|
todoNodesGauge.set(value)
|
|
|
|
|
|
|
|
|
|
proc onOk(value: int64) =
|
|
|
|
|
okNodesGauge.set(value)
|
|
|
|
|
|
|
|
|
|
proc onNok(value: int64) =
|
|
|
|
|
nokNodesGauge.set(value)
|
2025-03-18 15:55:58 +01:00
|
|
|
|
2025-03-20 16:20:37 +01:00
|
|
|
proc onRequests(value: int64) =
|
|
|
|
|
requestsGauge.set(value)
|
|
|
|
|
|
|
|
|
|
proc onRequestSlots(value: int64) =
|
|
|
|
|
requestSlotsGauge.set(value)
|
|
|
|
|
|
|
|
|
|
proc onTotalSize(value: int64) =
|
|
|
|
|
totalStorageSizeGauge.set(value)
|
2025-02-11 14:29:41 +01:00
|
|
|
|
2025-03-18 15:55:58 +01:00
|
|
|
return
|
2025-03-20 16:20:37 +01:00
|
|
|
Metrics(todoNodes: onTodo, okNodes: onOk, nokNodes: onNok, onRequests: onRequests, onRequestSlots: onRequestSlots, onTotalSize: onTotalSize)
|