108 lines
3.2 KiB
Nim
Raw Normal View History

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(pendingGauge, "Marketplace pending storage requests")
2025-03-20 16:20:37 +01:00
declareGauge(requestSlotsGauge, "Marketplace active storage request slots")
2025-03-21 09:41:05 +01:00
declareGauge(
totalStorageSizeGauge, "Marketplace total bytes stored in active storage requests"
)
declareGauge(
totalPriceGauge,
"Marketplace total price per byte per second of all active storage requests",
)
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
onPending: OnUpdateMetric
2025-03-20 16:20:37 +01:00
onRequestSlots: OnUpdateMetric
onTotalSize: OnUpdateMetric
onPrice: 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 setPendingRequests*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
m.onPending(value.int64)
2025-03-20 16:20:37 +01:00
method setRequestSlots*(m: Metrics, value: int) {.base, gcsafe, raises: [].} =
m.onRequestSlots(value.int64)
2025-03-21 09:41:05 +01:00
method setTotalSize*(m: Metrics, value: int64) {.base, gcsafe, raises: [].} =
2025-03-20 16:20:37 +01:00
m.onTotalSize(value.int64)
method setPrice*(m: Metrics, value: int64) {.base, gcsafe, raises: [].} =
m.onPrice(value.int64)
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 onPending(value: int64) =
pendingGauge.set(value)
2025-03-20 16:20:37 +01:00
proc onRequestSlots(value: int64) =
requestSlotsGauge.set(value)
proc onTotalSize(value: int64) =
totalStorageSizeGauge.set(value)
2025-02-11 14:29:41 +01:00
proc onPrice(value: int64) =
totalPriceGauge.set(value)
2025-03-21 09:41:05 +01:00
return Metrics(
todoNodes: onTodo,
okNodes: onOk,
nokNodes: onNok,
onRequests: onRequests,
onPending: onPending,
2025-03-21 09:41:05 +01:00
onRequestSlots: onRequestSlots,
onTotalSize: onTotalSize,
onPrice: onPrice,
2025-03-21 09:41:05 +01:00
)