2017-12-04 5 views
0

DropwizardMetricServices # submit() Ich verwende die Messgröße nicht zum zweiten Mal.DropwizardMetricServices sendet die Messgröße nicht zum zweiten Mal an JMX (nach dem ersten Entfernen)

, d. H. Mein Anwendungsfall ist das Entfernen der Messgröße von JMX nach dem Lesen. Und meine Anwendung kann die gleiche Metrik (mit unterschiedlichem Wert) senden.

Zum ersten Mal wird die Metrik-Metrik erfolgreich übergeben (dann entfernt meine Anwendung sie, sobald sie die Metrik gelesen hat). Aber dieselbe Metrik wird nicht zum zweiten Mal eingereicht.

Also, ich bin ein bisschen verwirrt, was wäre der Grund für DropwizardMetricServices # submit() nicht zum zweiten Mal zu arbeiten?

Unten finden Sie den Code ein:

Senden metrisch:

private void submitNonSparseMetric(final String metricName, final long value) { 
    validateMetricName(metricName); 
    metricService.submit(metricName, value); // metricService is the DropwizardMetricServices 
    log(metricName, value); 
    LOGGER.debug("Submitted the metric {} to JMX", metricName); 
} 

Code, der die Metrik liest und entfernt:

protected void collectMetrics() { 
    // Create the connection 
    Long currTime = System.currentTimeMillis()/1000; // Graphite needs 
    Socket connection = createConnection(); 
    if (connection == null){ 
     return; 
    } 
    // Get the output stream 
    DataOutputStream outputStream = getDataOutputStream(connection); 
    if (outputStream == null){ 
     closeConnection(); 
     return; 
    } 
    // Get metrics from JMX 
    Map<String, Gauge> g = metricRegistry.getGauges(); // metricRegistry is com.codahale.metrics.MetricRegistry 
    for(Entry<String, Gauge> e : g.entrySet()){ 
     String key = e.getKey(); 
     if(p2cMetric(key)){ 
      String metricName = convertToMetricStandard(key); 
      String metricValue = String.valueOf(e.getValue().getValue()); 

      String metricToSend = String.format("%s %s %s\n", metricName, metricValue, currTime); 
      try { 
       writeToStream(outputStream, metricToSend); 
       // Remove the metric from JMX after successfully sending metric to graphite 
       removeMetricFromJMX(key); 
      } catch (IOException e1) { 
       LOGGER.error("Unable to send metric to Graphite - {}", e1.getMessage()); 
      } 
     } 

    } 

    closeOutputStream(); 
    closeConnection(); 
} 

Antwort

0

Ich glaube, ich das Problem gefunden.

Gemäß der DropwizardMetricServices doc - https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/actuate/metrics/dropwizard/DropwizardMetricServices.html#submit-java.lang.String-double-, submit() Methode Set the specified gauge value. Also, ich denke, es ist zu empfehlen, DropwizardMetricServices # submit() -Methode zu verwenden, um nur die Werte eines vorhandenen Messinstruments in JMX und nicht zum Hinzufügen neuer Metrik zu JMX.

Also, nachdem ich DropwizardMetricServices # submit() mit MetricRegistry # register() (com.codahale.metrics.MetricRegistry) -Methode ersetzt, um alle meine Metriken zu übermitteln, hat es wie erwartet funktioniert und meine Metriken werden zu JMX (sobald sie waren) durch meine Bewerbung entfernt).

Aber ich frage mich nur, was DropwizardMetricServices # submit() macht, um nur neue Metriken zu JMX hinzuzufügen und nicht irgendwelche Metriken, die bereits entfernt wurden (von JMX). Speichert DropwizardMetricServices alle Messwerte, die an JMX gesendet wurden (im Speicher)? das macht DropwizardMetricServices # submit() Methode, die Metrik nicht erneut zu übermitteln?

Verwandte Themen