native log-to-file functionality
Relating to https://github.com/flashbots/mev-boost/pull/294#issuecomment-1271171387
If we wanted to go down a non-integrated "sidecar" implementation for adding prometheus metrics, we could explore tailing a log file and using a grok exporter, something like: github.com/fstab/grok_exporter
Given there's no maintained docker containers for this AFAICS, i have built a docker container for this here: https://github.com/0xSte/grok-exporter https://hub.docker.com/r/0xste/grok-exporter
Got a semi-functional configuration for this, exporting the following prometheus metrics
# HELP mev_boost_genesis_fork_version_info The fork version mev boost is using
# TYPE mev_boost_genesis_fork_version_info counter
mev_boost_genesis_fork_version_info{version="0x00001020"} 1
# HELP mev_boost_http_performance_bucket The response latency for the http tier
# TYPE mev_boost_http_performance_bucket histogram
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="0.05"} 317
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="0.1"} 327
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="0.15"} 341
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="0.2"} 341
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="0.25"} 341
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="0.5"} 341
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="1"} 341
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="2"} 343
mev_boost_http_performance_bucket_bucket{method="GET",status="200",le="+Inf"} 346
mev_boost_http_performance_bucket_sum{method="GET",status="200"} 15.885456450000001
mev_boost_http_performance_bucket_count{method="GET",status="200"} 346
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="0.05"} 1663
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="0.1"} 2879
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="0.15"} 4411
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="0.2"} 5356
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="0.25"} 5518
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="0.5"} 5559
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="1"} 5562
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="2"} 5564
mev_boost_http_performance_bucket_bucket{method="POST",status="200",le="+Inf"} 5564
mev_boost_http_performance_bucket_sum{method="POST",status="200"} 556.3413647959985
mev_boost_http_performance_bucket_count{method="POST",status="200"} 5564
# HELP mev_boost_http_requests_total The the number of http requests
# TYPE mev_boost_http_requests_total counter
mev_boost_http_requests_total{method="GET",path="//eth/v1/builder/status",status="301"} 3
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/3895630/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/header/<redacted>/<redacted>/<redacted>",status="200"} 1
mev_boost_http_requests_total{method="GET",path="/eth/v1/builder/status",status="200"} 319
mev_boost_http_requests_total{method="POST",path="/eth/v1/builder/blinded_blocks",status="200"} 20
mev_boost_http_requests_total{method="POST",path="/eth/v1/builder/blinded_blocks",status="400"} 2
mev_boost_http_requests_total{method="POST",path="/eth/v1/builder/validators",status="200"} 5544
mev_boost_http_requests_total{method="POST",path="/eth/v1/builder/validators",status="502"} 4
# HELP mev_boost_logged_errors_total The the number of errors in log files
# TYPE mev_boost_logged_errors_total counter
mev_boost_logged_errors_total 40
# HELP mev_boost_logged_warning_total The the number of warnings in log files
# TYPE mev_boost_logged_warning_total counter
mev_boost_logged_warning_total 2869
# HELP mev_boost_relay_count The the number of relays registered
# TYPE mev_boost_relay_count gauge
mev_boost_relay_count 3
# HELP mev_boost_relay_info The the number of relays registered
# TYPE mev_boost_relay_info counter
mev_boost_relay_info{host="bloxroute.max-profit.builder.goerli.blxrbdn.com",pubkey="<redacted>"} 1
mev_boost_relay_info{host="builder-relay-goerli.blocknative.com",pubkey="<redacted>"} 1
mev_boost_relay_info{host="builder-relay-goerli.flashbots.net",pubkey=""} 1
# HELP mev_boost_server_info The host and port the mev boost server is running on
# TYPE mev_boost_server_info counter
mev_boost_server_info{host="0.0.0.0",port="18550"} 1
# HELP mev_boost_version_info the version of mev-boost
# TYPE mev_boost_version_info counter
mev_boost_version_info{version="0.8.2"} 1
# HELP promhttp_metric_handler_requests_in_flight Current number of scrapes being served.
# TYPE promhttp_metric_handler_requests_in_flight gauge
promhttp_metric_handler_requests_in_flight 1
# HELP promhttp_metric_handler_requests_total Total number of scrapes by HTTP status code.
# TYPE promhttp_metric_handler_requests_total counter
promhttp_metric_handler_requests_total{code="200"} 0
promhttp_metric_handler_requests_total{code="500"} 0
promhttp_metric_handler_requests_total{code="503"} 0
Note: I've redacted metric label values which showed identifiable info & only included metrics from the grok config
here's my initial configuration for this
global:
config_version: 3
input:
type: file
paths:
- ./mev.log
readall: true
fail_on_missing_logfile: true
imports:
- type: grok_patterns
dir: ./patterns
metrics:
- type: counter
name: mev_boost_version_info
help: the version of mev-boost
match: '%{mev_boost_version}'
labels:
version: '{{.version}}'
- type: counter
name: mev_boost_server_info
help: The host and port the mev boost server is running on
match: '%{mev_boost_server}'
labels:
host: '{{.host}}'
port: '{{.port}}'
- type: counter
name: mev_boost_genesis_fork_version_info
help: The fork version mev boost is using
match: '%{mev_boost_fork_version}'
labels:
version: '{{.version}}'
- type: gauge
name: mev_boost_relay_count
help: The the number of relays registered
match: '%{mev_boost_relay_count}'
value: '{{.count}}'
- type: counter
name: mev_boost_relay_info
help: The the number of relays registered
match: '%{mev_boost_relay_info}'
labels:
pubkey: '{{.pubkey}}'
host: '{{.host}}'
- type: counter
name: mev_boost_http_requests_total
help: The the number of http requests
match: '%{mev_boost_http_requests}'
labels:
status: '{{.status}}'
path: '{{.path}}'
method: '{{.method}}'
- type: histogram
name: mev_boost_http_performance_bucket
help: The response latency for the http tier
match: '%{mev_boost_http_latency}'
value: '{{.duration}}'
buckets: [0.05, 0.1, 0.15, 0.2, 0.25, 0.5, 1, 2]
labels:
method: '{{.method}}'
status: '{{.status}}'
- type: counter
name: mev_boost_logged_errors_total
help: The the number of errors in log files
match: '%{mev_boost_log_errors}'
- type: counter
name: mev_boost_logged_warning_total
help: The the number of warnings in log files
match: '%{mev_boost_log_warnings}'
server:
port: 9144