001package io.prometheus.client.spring.boot;
002
003import io.prometheus.client.exporter.common.TextFormat;
004import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
005import org.springframework.boot.context.properties.ConfigurationProperties;
006import org.springframework.http.ResponseEntity;
007import org.springframework.web.bind.annotation.RequestHeader;
008import org.springframework.web.bind.annotation.RequestMapping;
009import org.springframework.web.bind.annotation.RequestMethod;
010import org.springframework.web.bind.annotation.RequestParam;
011import org.springframework.web.bind.annotation.ResponseBody;
012
013import java.util.Set;
014
015import static org.springframework.http.HttpHeaders.CONTENT_TYPE;
016
017@ConfigurationProperties("endpoints.prometheus")
018public class PrometheusMvcEndpoint extends EndpointMvcAdapter {
019
020  private final PrometheusEndpoint delgate;
021
022  public PrometheusMvcEndpoint(PrometheusEndpoint delegate) {
023    super(delegate);
024    this.delgate = delegate;
025  }
026
027  @RequestMapping(
028          method = {RequestMethod.GET},
029          produces = { "*/*" }
030  )
031  @ResponseBody
032  public ResponseEntity value(
033          @RequestParam(value = "name[]", required = false, defaultValue = "") Set<String> name,
034          @RequestHeader(value = "Accept", required = false, defaultValue = "") String accept) {
035    if (!getDelegate().isEnabled()) {
036      // Shouldn't happen - MVC endpoint shouldn't be registered when delegate's
037      // disabled
038      return getDisabledResponse();
039    }
040
041    String contentType = TextFormat.chooseContentType(accept);
042    String result = delgate.writeRegistry(name, contentType);
043    return ResponseEntity.ok()
044            .header(CONTENT_TYPE, contentType)
045            .body(result);
046  }
047}