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

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

Michael Simons

September 13, 2018
Tweet

More Decks by Michael Simons

Other Decks in Programming

Transcript

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

    View full-size slide

  2. • Ziele des heutigen Vortrags
    • Über Neo4j
    • Kernkonzepte von Micrometer
    • Metriken unterschiedlicher Ebenen
    • Monitoring
    Agenda

    View full-size slide

  3. Ziele des heutigen
    Vortrags

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  6. 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/

    View full-size slide

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

    View full-size slide

  8. Spring Data und Neo4j

    View full-size slide

  9. Ü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)

    View full-size slide

  10. Kernkonzepte von
    Micrometer

    View full-size slide

  11. • Logging
    • Tracing
    • Metrics
    Unterschiedliche Wege, ein System zu beobachten

    View full-size slide

  12. 13
    • Neues Projekt von Pivotal
    • „Like SLF4J but for metrics“
    • Herstellerneutrale Fassade für
    Metriken
    • Kein Neo4j-Produkt
    Micrometer

    View full-size slide

  13. Spring Boot Actuator stellt Metriken bereit

    org.springframework.boot
    spring-boot-starter-actuator

    View full-size slide

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

    View full-size slide

  15. {
    "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.

    View full-size slide

  16. Diese Metriken sehen in Boot 2 deutlich anders aus

    View full-size slide


  17. org.springframework.boot
    spring-boot-starter-parent
    1.5.12.RELEASE


    Diese Metriken sehen in Boot 2 deutlich anders aus

    View full-size slide


  18. org.springframework.boot
    spring-boot-starter-parent
    2.0.1.RELEASE


    Diese Metriken sehen in Boot 2 deutlich anders aus

    View full-size slide

  19. 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

    View full-size slide

  20. Diese Metriken sehen in Boot 2 deutlich anders aus
    management.endpoints.web.exposure.include = *

    View full-size slide

  21. 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

    View full-size slide

  22. {
    "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? !

    View full-size slide

  23. 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…

    View full-size slide

  24. 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“

    View full-size slide

  25. • Dimensionen
    • Registries
    • Messinstrumente (Meter)
    Kernkonzepte von Micrometer

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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…
    • 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

    View full-size slide

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

    View full-size slide

  30. • Globale tags für alle Metriken
    Tags definieren

    View full-size slide

  31. • 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);

    View full-size slide

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

    View full-size slide

  33. Sammeln, speichern und
    exportieren Metriken
    • Simple registry
    Registries
    MeterRegistry registry = new SimpleMeterRegistry();

    View full-size slide

  34. 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

    View full-size slide

  35. 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)

    View full-size slide

  36. • „Pluggable“ Service-Provider-Interface
    SPI für Registries

    View full-size slide

  37. Messinstrumente

    View full-size slide

  38. Metriken
    unterschiedlicher Ebenen

    View full-size slide

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

    View full-size slide

  40. • 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);

    View full-size slide

  41. • Container-Metriken
    • Message-Queue-Auslastung
    • Hystrix
    • Datenbankverbindungs-Usage
    • Hibernate-Statistiken
    • (Zukunftsmusik: Neo4j-Java-Driver-Metriken, Graph-Metriken)
    Anwendungsmetriken

    View full-size slide

  42. Neo4j-Metriken?
    @Component
    @RequiredArgsConstructor
    public class Neo4jServerMetrics implements MeterBinder {
    private final Session session;
    @Override
    public void bindTo(MeterRegistry registry) {
    ToDoubleFunction 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 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));
    }
    }

    View full-size slide

  43. • Spring MVC
    • Spring WebFlux
    • RestTemplate (HTTP Client)
    • Spring Integration
    • Spring MQ
    Anwendungsmetriken (mit Spring Boot)

    View full-size slide

  44. • Micrometer bringt: Eine API, um EURE Metriken zu erfassen
    Domain-Metriken („KPIs“)

    View full-size slide

  45. • 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“)

    View full-size slide

  46. Wo speichern?

    View full-size slide

  47. • Atlas
    • Datadog
    • Datadog StatsD
    • Influx
    • Prometheus
    • SignalFx
    • Telegraf StatsD
    • Wavefront
    Mehrdimensionale Monitoring Systeme

    View full-size slide

  48. • Graphite
    • Ganglia
    • JMX
    • Etsy StatsD
    Hierarchische Monitoring Systeme

    View full-size slide

  49. Wie speichern?

    View full-size slide

  50. • Atlas
    • Datadog
    • Graphite
    • Ganglia
    • Influx
    • JMX
    • all StatsD flavors
    • SignalFx
    • Wavefront
    Push model

    View full-size slide

  51. • Prometheus
    Poll model

    View full-size slide

  52. • 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']

    View full-size slide


  53. io.micrometer
    micrometer-registry-prometheus


    io.micrometer
    micrometer-registry-statsd


    io.micrometer
    micrometer-registry-graphite

    Wie einrichten?

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide