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 Slide

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

    View Slide

  3. Ziele des heutigen
    Vortrags

    View 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 Slide

  5. Über Neo4j

    View Slide

  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

    View Slide

  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/

    View Slide

  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

    View Slide

  9. Spring Data und Neo4j

    View Slide

  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)

    View Slide

  11. Kernkonzepte von
    Micrometer

    View Slide

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

    View Slide

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

    View Slide

  14. Spring Boot Actuator stellt Metriken bereit

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

    View Slide

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

    View Slide

  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.

    View Slide

  17. Diese Metriken sehen in Boot 2 deutlich anders aus

    View Slide


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


    Diese Metriken sehen in Boot 2 deutlich anders aus

    View Slide


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


    Diese Metriken sehen in Boot 2 deutlich anders aus

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  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? !

    View Slide

  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…

    View Slide

  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“

    View Slide

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

    View Slide

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

    View 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…
    Dimensionen
    counter
    status
    201
    mine

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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);

    View Slide

  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);

    View Slide

  34. Registries

    View Slide

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

    View Slide

  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

    View Slide

  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)

    View Slide

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

    View Slide

  39. Messinstrumente

    View Slide

  40. Counter

    View Slide

  41. Gauges

    View Slide

  42. Timer

    View Slide

  43. Demo

    View Slide

  44. Metriken
    unterschiedlicher Ebenen

    View Slide

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

    View Slide

  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);

    View Slide

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

    View Slide

  48. 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 Slide

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

    View Slide

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

    View Slide

  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“)

    View Slide

  52. Demo

    View Slide

  53. Monitoring

    View Slide

  54. Wo speichern?

    View Slide

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

    View Slide

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

    View Slide

  57. Wie speichern?

    View Slide

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

    View Slide

  59. • Prometheus
    Poll model

    View Slide

  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']

    View Slide


  61. io.micrometer
    micrometer-registry-prometheus


    io.micrometer
    micrometer-registry-statsd


    io.micrometer
    micrometer-registry-graphite

    Wie einrichten?

    View Slide

  62. Demo

    View Slide

  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

    View Slide

  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

    View Slide

  65. Thank you!

    View Slide

  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

    View Slide