[
https://issues.apache.org/jira/browse/FLINK-6221?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16009543#comment-16009543
]
ASF GitHub Bot commented on FLINK-6221:
---------------------------------------
Github user zentol commented on a diff in the pull request:
https://github.com/apache/flink/pull/3833#discussion_r116368667
--- Diff:
flink-metrics/flink-metrics-prometheus/src/test/java/org/apache/flink/metrics/prometheus/PrometheusReporterTest.java
---
@@ -0,0 +1,192 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.flink.metrics.prometheus;
+
+import com.mashape.unirest.http.HttpResponse;
+import com.mashape.unirest.http.Unirest;
+import com.mashape.unirest.http.exceptions.UnirestException;
+import org.apache.flink.configuration.ConfigConstants;
+import org.apache.flink.configuration.Configuration;
+import org.apache.flink.configuration.MetricOptions;
+import org.apache.flink.metrics.Counter;
+import org.apache.flink.metrics.Gauge;
+import org.apache.flink.metrics.Histogram;
+import org.apache.flink.metrics.Meter;
+import org.apache.flink.metrics.Metric;
+import org.apache.flink.metrics.SimpleCounter;
+import org.apache.flink.metrics.reporter.MetricReporter;
+import org.apache.flink.metrics.util.TestMeter;
+import org.apache.flink.runtime.metrics.MetricRegistry;
+import org.apache.flink.runtime.metrics.MetricRegistryConfiguration;
+import org.apache.flink.runtime.metrics.groups.FrontMetricGroup;
+import org.apache.flink.runtime.metrics.groups.TaskManagerMetricGroup;
+import org.apache.flink.runtime.metrics.util.TestingHistogram;
+import org.apache.flink.util.TestLogger;
+import org.junit.After;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import java.util.Arrays;
+
+import static
org.apache.flink.metrics.prometheus.PrometheusReporter.ARG_PORT;
+import static
org.apache.flink.runtime.metrics.scope.ScopeFormat.SCOPE_SEPARATOR;
+import static org.hamcrest.Matchers.both;
+import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertThat;
+
+public class PrometheusReporterTest extends TestLogger {
+ private static final int NON_DEFAULT_PORT = 9429;
+
+ private static final String HOST_NAME = "hostname";
+ private static final String TASK_MANAGER = "tm";
+
+ private static final String HELP_PREFIX = "# HELP ";
+ private static final String TYPE_PREFIX = "# TYPE ";
+ private static final String DIMENSIONS = "host=\"" + HOST_NAME +
"\",tm_id=\"" + TASK_MANAGER + "\"";
+ private static final String DEFAULT_LABELS = "{" + DIMENSIONS + ",}";
+ private static final String SCOPE_PREFIX = "taskmanager_";
+
+ @Rule
+ public ExpectedException thrown = ExpectedException.none();
+
+ private MetricRegistry registry = prepareMetricRegistry();
+
+ private final MetricReporter reporter = registry.getReporters().get(0);
+
+ @Test
+ public void counterIsReportedAsPrometheusGauge() throws
UnirestException {
+ //Prometheus counters may not decrease
+ Counter testCounter = new SimpleCounter();
+ testCounter.inc(7);
+
+ String counterName = "testCounter";
+ String gaugeName = SCOPE_PREFIX + counterName;
+
+ assertThat(addMetricAndPollResponse(testCounter, counterName),
+ containsString(HELP_PREFIX + gaugeName + " " +
getFullMetricName(counterName) + "\n" +
+ TYPE_PREFIX + gaugeName + "
gauge" + "\n" +
+ gaugeName + DEFAULT_LABELS +
" 7.0"));
+ }
+
+ @Test
+ public void gaugeIsReportedAsPrometheusGauge() throws UnirestException {
+ Gauge<Integer> testGauge = new Gauge<Integer>() {
+ @Override
+ public Integer getValue() {
+ return 1;
+ }
+ };
+
+ String gaugeName = "testGauge";
+ String prometheusGaugeName = SCOPE_PREFIX + gaugeName;
+
+ assertThat(addMetricAndPollResponse(testGauge, gaugeName),
+ containsString(HELP_PREFIX + prometheusGaugeName + " "
+ getFullMetricName(gaugeName) + "\n" +
+ TYPE_PREFIX +
prometheusGaugeName + " gauge" + "\n" +
+ prometheusGaugeName +
DEFAULT_LABELS + " 1.0"));
+ }
+
+ @Test
+ public void histogramIsReportedAsPrometheusSummary() throws
UnirestException {
+ Histogram testHistogram = new TestingHistogram();
+
+ String histogramName = "testHistogram";
+ String summaryName = SCOPE_PREFIX + histogramName;
+
+ String response = addMetricAndPollResponse(testHistogram,
histogramName);
+ assertThat(response, both(containsString(HELP_PREFIX +
summaryName + " " + getFullMetricName(histogramName) + "\n" +
+
TYPE_PREFIX + summaryName + " summary" + "\n"))
+ .and(containsString(summaryName + "_count" +
DEFAULT_LABELS + " 1.0")));
+ for (String quantile : Arrays.asList("0.5", "0.75", "0.95",
"0.98", "0.99", "0.999")) {
+ assertThat(response, containsString(
+ summaryName + "{" + DIMENSIONS + ",quantile=\""
+ quantile + "\",} " + quantile));
+ }
+ }
+
+ @Test
+ public void meterTotalIsReportedAsPrometheusCounter() throws
UnirestException {
+ Meter testMeter = new TestMeter();
+
+ String meterName = "testMeter";
+ String counterName = SCOPE_PREFIX + meterName + "_total";
+
+ assertThat(addMetricAndPollResponse(testMeter, meterName),
+ containsString(HELP_PREFIX + counterName + " " +
getFullMetricName(meterName) + "\n" +
+ TYPE_PREFIX + counterName +
" counter" + "\n" +
+ counterName + DEFAULT_LABELS
+ " 100.0"));
+ }
+
+ @Test
+ public void endpointIsUnavailableAfterReporterIsClosed() throws
UnirestException {
+ reporter.close();
+ thrown.expect(UnirestException.class);
+ pollMetrics();
+ }
+
+ @Test
+ public void invalidCharactersAreReplacedWithUnderscore() {
+ assertThat(PrometheusReporter.replaceInvalidChars(""),
equalTo(""));
+ assertThat(PrometheusReporter.replaceInvalidChars("abc"),
equalTo("abc"));
+ assertThat(PrometheusReporter.replaceInvalidChars("abc\""),
equalTo("abc_"));
+ assertThat(PrometheusReporter.replaceInvalidChars("\"abc"),
equalTo("_abc"));
+ assertThat(PrometheusReporter.replaceInvalidChars("\"abc\""),
equalTo("_abc_"));
+
assertThat(PrometheusReporter.replaceInvalidChars("\"a\"b\"c\""),
equalTo("_a_b_c_"));
+ assertThat(PrometheusReporter.replaceInvalidChars("\"\"\"\""),
equalTo("____"));
+ assertThat(PrometheusReporter.replaceInvalidChars(" "),
equalTo("____"));
+ assertThat(PrometheusReporter.replaceInvalidChars("\"ab
;(c)'"), equalTo("_ab___c__"));
+ assertThat(PrometheusReporter.replaceInvalidChars("a b c"),
equalTo("a_b_c"));
+ assertThat(PrometheusReporter.replaceInvalidChars("a b c "),
equalTo("a_b_c_"));
+ assertThat(PrometheusReporter.replaceInvalidChars("a;b'c*"),
equalTo("a_b_c_"));
+
assertThat(PrometheusReporter.replaceInvalidChars("a,=;:?'b,=;:?'c"),
equalTo("a___:__b___:__c"));
+ }
+
+ private String addMetricAndPollResponse(Metric metric, String
metricName) throws UnirestException {
+ reporter.notifyOfAddedMetric(metric, metricName, new
FrontMetricGroup<>(0, new TaskManagerMetricGroup(registry, HOST_NAME,
TASK_MANAGER)));
+ return pollMetrics().getBody();
+ }
+
+ private static HttpResponse<String> pollMetrics() throws
UnirestException {
+ return Unirest.get("http://localhost:" + NON_DEFAULT_PORT +
"/metrics").asString();
+ }
+
+ private static String getFullMetricName(String metricName) {
+ return HOST_NAME + SCOPE_SEPARATOR + "taskmanager" +
SCOPE_SEPARATOR + TASK_MANAGER + SCOPE_SEPARATOR + metricName;
+ }
+
+ private static MetricRegistry prepareMetricRegistry() {
--- End diff --
This method is a bit overkill for a one-liner that is called once.
> Add Prometheus support to metrics
> ---------------------------------
>
> Key: FLINK-6221
> URL: https://issues.apache.org/jira/browse/FLINK-6221
> Project: Flink
> Issue Type: Improvement
> Components: Metrics
> Affects Versions: 1.2.0
> Reporter: Joshua Griffith
> Assignee: Maximilian Bode
> Priority: Minor
>
> [Prometheus|https://prometheus.io/] is becoming popular for metrics and
> alerting. It's possible to use
> [statsd-exporter|https://github.com/prometheus/statsd_exporter] to load Flink
> metrics into Prometheus but it would be far easier if Flink supported
> Promethus as a metrics reporter. A [dropwizard
> client|https://github.com/prometheus/client_java/tree/master/simpleclient_dropwizard]
> exists that could be integrated into the existing metrics system.
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)