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

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

20492a196bb034ad3aa7e05e593fede9?s=128

Michael Simons

September 13, 2018
Tweet

Transcript

  1. Micrometer Neue Einsichten, nicht nur für Spring Boot Michael Simons,

    Neo4j @rotnroll666
  2. • Ziele des heutigen Vortrags • Über Neo4j • Kernkonzepte

    von Micrometer • Metriken unterschiedlicher Ebenen • Monitoring Agenda
  3. Ziele des heutigen Vortrags

  4. • 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
  5. Über Neo4j

  6. • 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
  7. Neo4j https://neo4j.com/blog/icij-neo4j-unravel-panama-papers/ https://neo4j.com/blog/analyzing-panama-papers-neo4j/ ICIJ - International Consortium of Investigative Journalists

    https://neo4j.com/blog/analyzing-paradise-papers-neo4j/
  8. • 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
  9. Spring Data und Neo4j

  10. Ü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)
  11. Kernkonzepte von Micrometer

  12. • Logging • Tracing • Metrics Unterschiedliche Wege, ein System

    zu beobachten
  13. 13 • Neues Projekt von Pivotal • „Like SLF4J but

    for metrics“ • Herstellerneutrale Fassade für Metriken • Kein Neo4j-Produkt Micrometer
  14. Spring Boot Actuator stellt Metriken bereit <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>

  15. Spring Boot Actuator stellt Metriken bereit http://localhost:8080/metrics

  16. { "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.
  17. Diese Metriken sehen in Boot 2 deutlich anders aus

  18. <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.12.RELEASE</version> <relativePath/> </parent> Diese Metriken sehen in

    Boot 2 deutlich anders aus
  19. <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> <relativePath/> </parent> Diese Metriken sehen in

    Boot 2 deutlich anders aus
  20. 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
  21. Diese Metriken sehen in Boot 2 deutlich anders aus management.endpoints.web.exposure.include

    = *
  22. 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
  23. { "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? !
  24. 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…
  25. 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“
  26. • Dimensionen • Registries • Messinstrumente (Meter) Kernkonzepte von Micrometer

  27. • Hierarchische Metriken formen eine Taxonomie • Funktioniert für gut

    für eine begrenzte Anzahl an Informationen Dimensionen counter status 201
  28. • 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
  29. • 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
  30. • 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
  31. • Globale tags für alle Metriken Tags definieren

  32. • 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);
  33. • 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);
  34. Registries

  35. Sammeln, speichern und exportieren Metriken • Simple registry Registries MeterRegistry

    registry = new SimpleMeterRegistry();
  36. 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
  37. 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)
  38. • „Pluggable“ Service-Provider-Interface SPI für Registries

  39. Messinstrumente

  40. Counter

  41. Gauges

  42. Timer

  43. Demo

  44. Metriken unterschiedlicher Ebenen

  45. • Systemmetriken • Anwendungsmetriken • Domain-Metriken („KPIs“) Drei unterschiedliche Arten

    von Metriken
  46. • 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);
  47. • Container-Metriken • Message-Queue-Auslastung • Hystrix • Datenbankverbindungs-Usage • Hibernate-Statistiken

    • (Zukunftsmusik: Neo4j-Java-Driver-Metriken, Graph-Metriken) Anwendungsmetriken
  48. 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)); } }
  49. • Spring MVC • Spring WebFlux • RestTemplate (HTTP Client)

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

    Domain-Metriken („KPIs“)
  51. • 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“)
  52. Demo

  53. Monitoring

  54. Wo speichern?

  55. • Atlas • Datadog • Datadog StatsD • Influx •

    Prometheus • SignalFx • Telegraf StatsD • Wavefront Mehrdimensionale Monitoring Systeme
  56. • Graphite • Ganglia • JMX • Etsy StatsD Hierarchische

    Monitoring Systeme
  57. Wie speichern?

  58. • Atlas • Datadog • Graphite • Ganglia • Influx

    • JMX • all StatsD flavors • SignalFx • Wavefront Push model
  59. • Prometheus Poll model

  60. • 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']
  61. <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-statsd</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId>

    <artifactId>micrometer-registry-graphite</artifactId> </dependency> Wie einrichten?
  62. Demo

  63. • 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
  64. • 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
  65. Thank you!

  66. • 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