'Can't figure out how to change Prometheus content type header

So my metrics all appear in one line at my end-point, not in new line per metric. I use micrometer, spring, prometheus and scala.

My controller:

@RequestMapping(Array(""))
class MetricsController @Inject() (prometheusRegistry: PrometheusMeterRegistry) {

  @RequestMapping(value = Array("/metrics"), method = Array(RequestMethod.GET))
  def metricses(): String = {
    prometheusRegistry.scrape()
  }

}

Should it be enough to change the way I write the metrics them selves?

I have tried to add scrape(TextFormat.CONTENT_TYPE_004) but that changed nothing. Does it have to do with the HTTP response header? Would it work to add:

   .putHeader(HttpHeaders.CONTENT_TYPE, TextFormat.CONTENT_TYPE_004)
   .end(registry.scrape());

If so how would I do that in my case?

Thanks



Solution 1:[1]

Prometheus (or other compatible backends) will send you an Accept header that you should not ignore (please read about content negotiation) but if you want to ignore it:

@GetMapping(path = "/metrics", produces = MediaType.TEXT_PLAIN_VALUE)
@ResponseBody String metrics() {
    return registry.scrape();
}

If you don't want to ignore it, TextFormat has a chooseContentType method that you can utilize to get the content type based on the Accept header:

@GetMapping(path = "/metrics")
@ResponseBody ResponseEntity<String> metrics(@RequestHeader("accept") String accept) {
    String contentType = TextFormat.chooseContentType(accept);
    return ResponseEntity
            .ok()
            .contentType(MediaType.valueOf(contentType))
            .body(registry.scrape(contentType));
}

Or you can also set-up content negotiation: https://www.baeldung.com/spring-mvc-content-negotiation-json-xml

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Jonatan Ivanov