5

Kennt jemand Spring Boot Metriken mit Datadog?Spring boot metrics + datadog

Datadog ist ein Cloud-Überwachungsdienst für die IT.

Es ermöglicht Benutzern, ihre Daten mit Hilfe vieler Diagramme und Grafiken leicht zu visualisieren.

Ich habe eine Spring-Boot-Anwendung, die dropwizard Metriken verwendet, um viele Informationen über alle Methoden, die ich mit @Timed annotiert.

Andererseits stelle ich meine Anwendung in heroku bereit, damit ich keinen Datadog-Agenten installieren kann.

Ich möchte wissen, ob es eine Möglichkeit gibt, Spring-Boot-Metric-System-Reporting automatisch mit Datadog zu integrieren.

Antwort

8

Ich habe endlich einen dropwizzard Modul, das diese Bibliothek mit datadog integriert: metrics-datadog

ich eine Spring-Konfigurationsklasse erstellt habe, die diesen Reporter mit Eigenschaften meines YAML erstellt und initialisiert.

Legen Sie einfach diese Abhängigkeit in Ihrem pom:

<!-- Send metrics to Datadog --> 
    <dependency> 
     <groupId>org.coursera</groupId> 
     <artifactId>dropwizard-metrics-datadog</artifactId> 
     <version>1.1.3</version> 
    </dependency> 

diese Konfiguration Ihrer YAML hinzufügen:

yourapp: 
    metrics: 
    apiKey: <your API key> 
    host: <your host> 
    period: 10 
    enabled: true 

und fügen Sie diese Konfigurationsklasse zu einem Projekt:

/** 
* This bean will create and configure a DatadogReporter that will be in charge of sending 
* all the metrics collected by Spring Boot actuator system to Datadog. 
*  
* @see https://www.datadoghq.com/ 
* @author jfcorugedo 
* 
*/ 
@Configuration 
@ConfigurationProperties("yourapp.metrics") 
public class DatadogReporterConfig { 

    private static final Logger LOGGER = LoggerFactory.getLogger(DatadogReporterConfig.class); 

    /** Datadog API key used to authenticate every request to Datadog API */ 
    private String apiKey; 

    /** Logical name associated to all the events send by this application */ 
    private String host; 

    /** Time, in seconds, between every call to Datadog API. The lower this value the more information will be send to Datadog */ 
    private long period; 

    /** This flag enables or disables the datadog reporter */ 
    private boolean enabled = false; 

    @Bean 
    @Autowired 
    public DatadogReporter datadogReporter(MetricRegistry registry) { 

     DatadogReporter reporter = null; 
     if(enabled) { 
      reporter = enableDatadogMetrics(registry); 
     } else { 
      if(LOGGER.isWarnEnabled()) { 
       LOGGER.info("Datadog reporter is disabled. To turn on this feature just set 'rJavaServer.metrics.enabled:true' in your config file (property or YAML)"); 
      } 
     } 

     return reporter; 
    } 

    private DatadogReporter enableDatadogMetrics(MetricRegistry registry) { 

     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Initializing Datadog reporter using [ host: {}, period(seconds):{}, api-key:{} ]", getHost(), getPeriod(), getApiKey()); 
     } 

     EnumSet<Expansion> expansions = DatadogReporter.Expansion.ALL; 
     HttpTransport httpTransport = new HttpTransport 
           .Builder() 
           .withApiKey(getApiKey()) 
           .build(); 

     DatadogReporter reporter = DatadogReporter.forRegistry(registry) 
     .withHost(getHost()) 
     .withTransport(httpTransport) 
     .withExpansions(expansions) 
     .build(); 

     reporter.start(getPeriod(), TimeUnit.SECONDS); 

     if(LOGGER.isInfoEnabled()) { 
      LOGGER.info("Datadog reporter successfully initialized"); 
     } 

     return reporter; 
    } 

    /** 
    * @return Datadog API key used to authenticate every request to Datadog API 
    */ 
    public String getApiKey() { 
     return apiKey; 
    } 

    /** 
    * @param apiKey Datadog API key used to authenticate every request to Datadog API 
    */ 
    public void setApiKey(String apiKey) { 
     this.apiKey = apiKey; 
    } 

    /** 
    * @return Logical name associated to all the events send by this application 
    */ 
    public String getHost() { 
     return host; 
    } 

    /** 
    * @param host Logical name associated to all the events send by this application 
    */ 
    public void setHost(String host) { 
     this.host = host; 
    } 

    /** 
    * @return Time, in seconds, between every call to Datadog API. The lower this value the more information will be send to Datadog 
    */ 
    public long getPeriod() { 
     return period; 
    } 

    /** 
    * @param period Time, in seconds, between every call to Datadog API. The lower this value the more information will be send to Datadog 
    */ 
    public void setPeriod(long period) { 
     this.period = period; 
    } 

    /** 
    * @return true if DatadogReporter is enabled in this application 
    */ 
    public boolean isEnabled() { 
     return enabled; 
    } 

    /** 
    * This flag enables or disables the datadog reporter. 
    * This flag is only read during initialization, subsequent changes on this value will no take effect 
    * @param enabled 
    */ 
    public void setEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 
} 
+1

Es ist auch möglich, die gleiche Bibliothek für StatsD-Reporting anstelle von HTTP zu verwenden, falls sich jemand für diese Option interessieren sollte. –

+0

Müssen Sie einen Scheduler schreiben, weil das Hinzufügen bestimmter Ressourcen für mich nicht funktioniert. – Shek

2

Wenn JMX ist eine Option für Sie, Sie können die JMX dropwizrd reporter kombiniert mitverwenden

+0

Das ist ein guter Punkt. Wie auch immer, ich stelle meine App in heroku bereit, damit ich keinen datadog-Agenten im OS installieren kann. – jfcorugedo

+1

@jfcorugedo Ich denke nicht, dass die Frage etwas über Heroku erwähnt hat? Wenn eine Heroku-Lösung benötigt wird, müssen Sie sie zur Frage hinzufügen. – eis

+0

Ja, tut mir leid, dass Sie Recht haben – jfcorugedo