podman run postgres:14 du -sh /usr/lib/postgresql
24M /usr/lib/postgresql
This includes the binary.Our smallest is 32 cores and 1TB of RAM.
Could you elaborate? I use Prometheus to scrape from an HTTP endpoint in various Pods in Kubernetes, so the service discovery is pretty useful to me.
I could see the Kubernetes & the other SDs split out of the core binary if default size is really an issue. Or are you talking about something else?
Prometheus scrapes the same text format as OpenMetrics 1.0 and over 700 public exporters use this format, and there are TONS of other non-Prometheus software that consume the exact same text format. Prometheus's biggest competitor, Datadog (which is not open source mind you), consumes it too. I think even Grafana consumes it directly. It's becoming an IETF standard[0].
Would I have preferred JSON over a custom text format like this? Yeah. But to claim an open source project like Prometheus with effectively no business at all is using a text format like this to have vendor lock-in? That's quite a stretch.
[0] https://github.com/OpenObservability/OpenMetrics/blob/main/s...
I find the GP's claims weird - I've written a relative ton of collectors, exporters, and translators and the format is pretty OK, not worse than most that came before it and better than lots - but I think this relationship is backwards. Prometheus "scrapes OpenMetrics" because OpenMetrics was formal documentation of what Prometheus was already doing for years.
I would not have preferred JSON. That an exposed metric is also a query is also pretty close to a schematic definition is nice.
http.HandleFunc("/metrics", func(w http.ResponseWriter, req *http.Request) {
w.WriteHeader(http.StatusOK)
w.Header().Add("content-type", "text/plain")
w.Write([]byte("# HELP foo_bar The numbers of foos barred.\n# TYPE foo_bar counter\nfoo_bar 42\n"))
})
The client library is largely to keep track of running counters (and gauges, histograms, etc.), with a small amount of code to actually report those metrics when scraped. It's a very simple format.The content type MUST be: application/openmetrics-text; version=1.0.0; charset=utf-8
https://github.com/OpenObservability/OpenMetrics/blob/main/s...
However Prometheus was designed before JSON was standardized itself, so I'm just glad they didn't choose XML!
IIRC (it's been almost a decade since I used varz), having multiple label values would be a map of maps in varz. It got quite ugly if you wanted to have a number of dimensions.
The other commenters have pointed out that it _is_ based on another open standard, but admittedly one less common than say, JSON. So you'll generally have to implement your own metrics producer or use a client library, that's true.
However it's also a dead simple format and you can probably implement it with a for-loop or a shell script.
JSON, especially free-form JSON, is not a good format for efficient metrics monitoring.
OpenMetrics's production rule for the format says:
labels = "{" [label *(COMMA label)] "}"
And yet, the Prometheus Java client library exports a trailing comma with no subsequent label.As for fp, I've seen parsers break on `e` v. `E`, and `NaN`/`Inf`/ vs. `nan`/`inf`. The latest IETF draft even has a comment,
; Not 100% sure this captures all float corner cases.
Control characters are allowed in descriptors and label values and no normalization form is specified.IIRC, Java is different from Python is different from Go. So, really, this is a standardization in languages problem. We tried to work around these as best we could in the OM format.
What? It's 100mb vs 25mb, like 75MB of data more... Who cares about a binary being 75MB larger in 2022?
Everything is layers. We build things on top of other things. If every layer had that attitude, then the bloat would be enormous. It's already getting there.
We should praise judicious effort into optimizing any of the resources used in the systems build, at every layer.