001/* 002 * Copyright 2012-2018 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017package org.springframework.boot.actuate.metrics.export.prometheus; 018 019import java.io.IOException; 020import java.io.StringWriter; 021import java.io.Writer; 022 023import io.prometheus.client.CollectorRegistry; 024import io.prometheus.client.exporter.common.TextFormat; 025 026import org.springframework.boot.actuate.endpoint.annotation.Endpoint; 027import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; 028import org.springframework.boot.actuate.endpoint.web.annotation.WebEndpoint; 029 030/** 031 * {@link Endpoint} that outputs metrics in a format that can be scraped by the Prometheus 032 * server. 033 * 034 * @author Jon Schneider 035 * @since 2.0.0 036 */ 037@WebEndpoint(id = "prometheus") 038public class PrometheusScrapeEndpoint { 039 040 private final CollectorRegistry collectorRegistry; 041 042 public PrometheusScrapeEndpoint(CollectorRegistry collectorRegistry) { 043 this.collectorRegistry = collectorRegistry; 044 } 045 046 @ReadOperation(produces = TextFormat.CONTENT_TYPE_004) 047 public String scrape() { 048 try { 049 Writer writer = new StringWriter(); 050 TextFormat.write004(writer, this.collectorRegistry.metricFamilySamples()); 051 return writer.toString(); 052 } 053 catch (IOException ex) { 054 // This actually never happens since StringWriter::write() doesn't throw any 055 // IOException 056 throw new RuntimeException("Writing metrics failed", ex); 057 } 058 } 059 060}