Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Micrometer: Neue Einsichten, nicht nur für Spri...

Micrometer: Neue Einsichten, nicht nur für Spring Boot bei der JUG Thüringen

Micrometer: https://micrometer.io

Demo: 
https://github.com/michael-simons/blockchain-playground 
(Inklusive Talk / Speakernotes)

Webinar von Jon Schneider, Micrometer Project-Lead
https://www.brighttalk.com/webcast/14893/316569

Michael Simons

September 13, 2018
Tweet

More Decks by Michael Simons

Other Decks in Programming

Transcript

  1. • Ziele des heutigen Vortrags • Über Neo4j • Kernkonzepte

    von Micrometer • Metriken unterschiedlicher Ebenen • Monitoring Agenda
  2. • Unterschiedliche Wege kennen lernen, ein System zu beobachten •

    Die Kernkonzepte von Micrometer verstehen • Dimensionen • Registries • Messinstrumente (Meter) • Metriken auf unterschiedlichen Ebenen identifizieren • Micrometer in Monitoring-Systemen integrieren Ziele des heutigen Vortrags
  3. • Neo4j ist die bevorzugte Plattform für stark verbundene Daten.

    • Neo4j bildet die Grundlage für analytische Anwendungen der nächsten Generation. • Prominente Anwendungsfälle sind machine learning, personalisierte Empfehlungen und fraud detection Neo4j
  4. • Spring Data Community Modul • Sehr frühes Spring Data

    Modul • Erste Version ~2010 (Emil Eifrem, Rod Johnson) • SDN 5: zweigeteilt, analog zu Spring Data JPA / ORM • Neo4j OGM: Object Graph Mapper • Spring Data Neo4j • Repositories • Derived und Custom queries • Events Spring Data und Neo4j
  5. Über mich • Neo4j seit Juli 2018 • Java Champion

    • Mitgründer und aktueller Leiter der Java User Group EuregJUG • Autor (Spring Boot 2 und Arc42 by example)
  6. 13 • Neues Projekt von Pivotal • „Like SLF4J but

    for metrics“ • Herstellerneutrale Fassade für Metriken • Kein Neo4j-Produkt Micrometer
  7. { "mem": 664619, "mem.free": 327742, "instance.uptime": 602975, "uptime": 606611, "systemload.average":

    3.19677734375, "heap.committed": 596480, "heap.init": 262144, "heap.used": 268737, "heap": 3728384, "nonheap.committed": 69472, "nonheap.init": 2496, "nonheap.used": 68142, "nonheap": 0, "threads.totalStarted": 101, "threads": 29, "datasource.primary.active": 0, "datasource.primary.usage": 0.0, "gauge.response.metrics": 2.0, "gauge.response.motd": 3.0, "gauge.response.star-star.favicon.ico": 8.0, "counter.status.200.star-star.favicon.ico": 1, "counter.status.200.metrics": 4, "counter.status.200.mine": 1008 } Spring Boot Actuator stellt Metriken bereit http://localhost:8080/metrics/counter.status.200.metrics „Drill down“ ie.
  8. curl -v localhost:8080/metrics * Trying 127.0.0.1... * TCP_NODELAY set *

    Connected to localhost (127.0.0.1) port 8080 (#0) > GET /metrics HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 404 < Content-Type: application/json;charset=UTF-8 < Transfer-Encoding: chunked < Date: Wed, 02 May 2018 20:26:59 GMT < * Connection #0 to host localhost left intact {"timestamp":"2018-05-02T20:26:59.437+0000","status":404,"error":"Not Found","message":"No message available","path":"/metrics"}% Diese Metriken sehen in Boot 2 deutlich anders aus
  9. curl -v localhost:8080/actuator/metrics * Trying ::1... * TCP_NODELAY set *

    Connected to localhost (::1) port 8080 (#0) > GET /actuator/metrics HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.54.0 > Accept: */* > < HTTP/1.1 200 < Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8 < Transfer-Encoding: chunked < Date: Wed, 02 May 2018 20:34:36 GMT < * Connection #0 to host localhost left intact {"names": ["process.cpu.usage","jvm.memory.max","jvm.gc.pause","jvm.buffer.memory.used""tom cat.threads.current"]}% Diese Metriken sehen in Boot 2 deutlich anders aus
  10. { "names": [ "jvm.buffer.memory.used", "jvm.memory.used", "jvm.memory.committed", "jdbc.connections.min", "hikaricp.connections.usage", "http.server.requests", "jvm.gc.max.data.size",

    "system.cpu.count", "tomcat.servlet.request.max", "hikaricp.connections.usage.percentile", "jdbc.connections.max", "tomcat.sessions.active.current", "system.cpu.usage", "jvm.threads.live", "jvm.classes.loaded", "jvm.classes.unloaded", "jvm.threads.peak", "tomcat.threads.current", "tomcat.global.request", "hikaricp.connections.creation", "jvm.gc.memory.promoted", "tomcat.sessions.rejected", "tomcat.sessions.alive.max" ] } Wo sind die Werte hin? !
  11. curl localhost:8080/actuator/metrics/http.server.requests | python -m json.tool { "name": "http.server.requests", "measurements":

    [ { "statistic": "COUNT", "value": 509.0 }, { "statistic": "MAX", "value": 0.012536956 } ], "availableTags": [ { "tag": "method", "values": [ "GET" ] }, { "tag": "uri", "values": [ "/mine", "/actuator/metrics/{requiredMetricName}" ] } ] } Echtes Drill-Down…
  12. curl localhost:8080/actuator/metrics/http.server.requests\?tag\=status:200\&tag\=uri:/mine | \ python -m json.tool { "name": "http.server.requests",

    "measurements": [ { "statistic": "COUNT", "value": 500.0 }, { "statistic": "MAX", "value": 0.0 } ], "availableTags": [ { "tag": "method", "values": [ "GET" ] } ] } …und „Tags“
  13. • Hierarchische Metriken formen eine Taxonomie • Funktioniert für gut

    für eine begrenzte Anzahl an Informationen Dimensionen counter status 201
  14. • Hierarchische Metriken formen eine Taxonomie • Funktioniert für gut

    für eine begrenzte Anzahl an Informationen • host-xyz.counter.status.201.mine ist noch in Ordnung… Dimensionen counter status 201 mine
  15. • Hierarchische Metriken formen eine Taxonomie • Funktioniert für gut

    für eine begrenzte Anzahl an Informationen • host-xyz.counter.status.201.mine ist noch in Ordnung… • Pattern für Dashboards etc. werden unwartbar • Solange blind für neue Metriken bis alle Pattern angepasst wurden. Dimensionen counter status 201 mine instance region cloud
  16. • Klassifizierung von Dingen basierend auf Schlagworten (tags) • Begriff

    „folksonomy“ entstand ungefähr 2004 • Die Vorteile laute Wikipedia • Vokabular des Benutzers • Flexibel • Mehrdimensional • Tags als Schlüssel/Werte-Paare formen die Dimension einer Metrik Von einer Taxonomy zur Folksonomy
  17. • Globale tags für alle Metriken • Spezifische Tags für

    einzelne Metriken Tags definieren Timer.builder("presentation.slide.timer") .description("This is a timer.") .tags( "JUG", "Thüringen", "place", "Erfurt" ) .register(meterRegistry);
  18. • Globale tags für alle Metriken • Spezifische Tags für

    einzelne Metriken Tags definieren Gauge.builder("jvm.memory.used", Runtime.getRuntime(), r -> r.totalMemory() - r.freeMemory()) .tag("host", "trenzalore") .tag("region", "my-desk") .register(meterRegistry);
  19. Sammeln, speichern und exportieren Metriken • Simple registry • Composite

    registries Registries CompositeMeterRegistry composite = new CompositeMeterRegistry(); Counter counter = composite.counter("counter"); counter.increment(); // noop SimpleMeterRegistry simple = new SimpleMeterRegistry(); composite.add(simple); counter.increment(); // now stuff happens
  20. Sammeln, speichern und exportieren Metriken • Simple registry • Composite

    registries • Global registry Registries MeterRegistry registry = Metrics.globalRegistry; Die globale Registry hat ein paar Eigenheiten • Per default Composite, aber ohne Elemente • Kann globale Quelle von Instrumenten sein • Mindestens eine (einfache) Registry muss hinzugefügt werden (Spring Boot macht das automatisch)
  21. • Classloader • JVM Memory usage • JVM Garbage Collector

    • JVM Thread usage • Processor usage Systemmetriken new ClassLoaderMetrics().bindTo(registry); new JvmMemoryMetrics().bindTo(registry); new JvmGcMetrics().bindTo(registry); new ProcessorMetrics().bindTo(registry); new JvmThreadMetrics().bindTo(registry);
  22. • Container-Metriken • Message-Queue-Auslastung • Hystrix • Datenbankverbindungs-Usage • Hibernate-Statistiken

    • (Zukunftsmusik: Neo4j-Java-Driver-Metriken, Graph-Metriken) Anwendungsmetriken
  23. Neo4j-Metriken? @Component @RequiredArgsConstructor public class Neo4jServerMetrics implements MeterBinder { private

    final Session session; @Override public void bindTo(MeterRegistry registry) { ToDoubleFunction<Session> nodeCount = session -> session.queryForObject(Double.class, "MATCH (n) RETURN COUNT(*)", Map.of()); Gauge.builder("neo4j.nodes.count", session, nodeCount) .description("Number of nodes in the graph") .baseUnit("nodes") .register(registry); ToDoubleFunction<Session> storeSize = session -> retrieveSysInfo(session, "Store sizes", "TotalStoreSize"); Gauge.builder("neo4j.store.size", session, storeSize) .description("Size of all stores") .baseUnit("bytes") .register(registry); } private static double retrieveSysInfo(Session session, String group, String attribute) { var query = "call dbms.queryJmx($jmxQuery) yield attributes\n" + "with keys(attributes) as k, attributes\n" + "unwind k as row with row, attributes\n" + "where row = $attribute\n" + "return attributes[row][\"value\"]"; var jmxQuery = String.format("org.neo4j:instance=kernel#0,name=%s", group); return session.queryForObject(Double.class, query, Map.of("jmxQuery", jmxQuery, "attribute", attribute)); } }
  24. • Spring MVC • Spring WebFlux • RestTemplate (HTTP Client)

    • Spring Integration • Spring MQ Anwendungsmetriken (mit Spring Boot)
  25. • Micrometer bringt: Eine API, um EURE Metriken zu erfassen

    • Ihr bringt eure Metriken • „Wieviele Produkte wurden in der letzten Stunde verkauft?“ • „Wie lang hat der letzte Bestellprozess gedauert?“ • „Wieviele offene Registrierungen gibt es?“ Domain-Metriken („KPIs“)
  26. • Atlas • Datadog • Datadog StatsD • Influx •

    Prometheus • SignalFx • Telegraf StatsD • Wavefront Mehrdimensionale Monitoring Systeme
  27. • Atlas • Datadog • Graphite • Ganglia • Influx

    • JMX • all StatsD flavors • SignalFx • Wavefront Push model
  28. • Prometheus Poll model scrape_configs: - job_name: 'reactive-java-chain' metrics_path: '/actuator/prometheus'

    static_configs: - targets: ['localhost:8080'] - job_name: 'reactive-kotlin-chain' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8090']
  29. • Micrometer hat viele weitere Funktionen • Histogramme • SLAs

    • Filter und transformer • Micrometer ist kein Spring Boot 2 spezifisches Produkt • Standalone • z.B. mit Micronaut, VertX • Legacy-Adapter für Spring Boot 1 Abschließende Worte
  30. • Demo: 
 github.com/michael-simons/blockchain-playground
 (Inklusive Talk / Speakernotes) • Slides:

    speakerdeck.com/michaelsimons • Webinar von Jon Schneider, Micrometer Project-Lead
 https://www.brighttalk.com/webcast/14893/316569 • Spring Boot Buch
 @SpringBootBuch // springbootbuch.de Ressourcen
  31. • Meter: https://unsplash.com/photos/zPZ9vqqDNBA • Library: https://unsplash.com/photos/xLhKkk2tKkA • Tally counter: https://www.flickr.com/photos/jauladeardilla/5768409603/

    • Gauge: https://unsplash.com/photos/HM731qUoUas • Timer: https://unsplash.com/photos/rBPOfVqROzY • Demo: 
 https://unsplash.com/photos/Uduc5hJX2Ew
 https://unsplash.com/photos/FlPc9_VocJ4
 https://unsplash.com/photos/gp8BLyaTaA0 • Monitoring
 https://unsplash.com/photos/mcSDtbWXUZU Bildquellen