Slide 1

Slide 1 text

Hello, Prometheus!! Goで作るexporter自作入門 2018-07-27 吉祥寺 .pm #15 LT by kaznishi

Slide 2

Slide 2 text

自己紹介 Twitter: @kaznishi1246 主な守備範囲: サーバーサイド,インフラ 主な使用言語: PHP, Scala 最近Goをプライベートで勉強してます

Slide 3

Slide 3 text

今回の話 Prometheusのサポートライブラリ(client_golang) を使ってexporterを自作してみる

Slide 4

Slide 4 text

Prometheusとは モニタリングツールの一種 OSS クラウド時代向けのツールであり、強力なサービ スディスカバリによってAutoScaling対応も簡単

Slide 5

Slide 5 text

Promethesのアーキテクチャ https://prometheus.io/docs/introduction/overview/ より図を引用

Slide 6

Slide 6 text

Promethesのアーキテクチャ Prometheusサーバがexporterにスクレイピングを 行い、データ収集をする。 ↑ node_exporterの出力例

Slide 7

Slide 7 text

exporterの種類 既に多くの種類のexporterがオフィシャル、サー ドパーティ問わず存在 https://prometheus.io/docs/instrumenting/export ers/ 代表的なものはサーバのメトリクスモニタリング を行うnode_exporterや、外形監視を行う blackbox_exporterなど

Slide 8

Slide 8 text

自作するには

Slide 9

Slide 9 text

自作するには 最終的にPrometheusサーバがスクレイピングでき る形式の出力を行うWebサーバになっていればよ いので、好きな言語で実装OK サポートライブラリが公開されている言語も https://prometheus.io/docs/instrumenting/clientli bs/ 今回はGoのサポートライブラリを使用する

Slide 10

Slide 10 text

Hello,World的に固定値を吐くだけの exporterを作ってみます repo: https://github.com/kaznishi/prometheus_expo rter_example

Slide 11

Slide 11 text

手順 メトリクスの記述子を作る Collectorを実装する Describeを実装する Collectを実装する メトリクス収集の中身を実装 CollectorをRegisterする エンドポイントを実装する

Slide 12

Slide 12 text

メトリクスの記述子を作る

Slide 13

Slide 13 text

メトリクスの記述子を作る https://github.com/prometheus/client_golang/blob/ master/prometheus/desc.go type Desc struct { fqName string help string constLabelPairs []*dto.LabelPair variableLabels []string id uint64 dimHash uint64 err error }

Slide 14

Slide 14 text

メトリクスの記述子を作る var ( exampleCount = prometheus.NewCounter( prometheus.CounterOpts{ Namespace: namespace, Name: "example_count", Help: "example counter help", }) exampleGauge = prometheus.NewGauge( prometheus.GaugeOpts{ Namespace: namespace, Name: "example_gauge", Help: "example gauge help", }) ) NewCounter,NewGauge処理内でDesc生成

Slide 15

Slide 15 text

メトリクスの記述子を作る ちなみに プロメテウスのデータ形式は Counter,Gauge,Histogram,Summaryの4種類。 入門としてはCounter,Gaugeを押さえておけばよ い。 Counter...単調増加する値(ex. 累計アクセス数) Gauge...上下する値(ex. リアルタイムアクセス数)

Slide 16

Slide 16 text

Collectorを実装する

Slide 17

Slide 17 text

Collectorインタフェース https://github.com/prometheus/client_golang/blob/ master/prometheus/collector.go type Collector interface { Describe(chan<- *Desc) Collect(chan<- Metric) } Describe メトリクスの記述子(Desc)を送信する Collect メトリクスを送信する

Slide 18

Slide 18 text

Collectorを実装する type myCollector struct {}

Slide 19

Slide 19 text

Collectorを実装する(Describe) func (c myCollector) Describe(ch chan<- *prometheus.Desc){ ch <- exampleCount.Desc() ch <- exampleGauge.Desc() }

Slide 20

Slide 20 text

Collectorを実装する(Collect) func (c myCollector) Collect(ch chan<- prometheus.Metric){ dummyStaticNumber := float64(1234) ch <- prometheus.MustNewConstMetric( exampleCount.Desc(), prometheus.CounterValue, float64(dummyStaticNumber), ) ch <- prometheus.MustNewConstMetric( exampleGauge.Desc(), prometheus.GaugeValue, float64(dummyStaticNumber), ) } exporterの要件によってdummyStaticNumberの部 分は適宜実装を変えて下さい

Slide 21

Slide 21 text

CollectorをRegisterする

Slide 22

Slide 22 text

エンドポイントを実装する

Slide 23

Slide 23 text

CollectorをRegisterする & エンドポイントを実装する var addr = flag.String( "listen-address", ":8080", "The address to listen on for HTTP requests." ) func main() { flag.Parse() var c myCollector prometheus.MustRegister(c) http.Handle("/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(*addr, nil)) }

Slide 24

Slide 24 text

結果

Slide 25

Slide 25 text

結果 Prometheusがスクレイピングできる形式になって る!

Slide 26

Slide 26 text

とりあえず固定値を吐くexporterは実装できた

Slide 27

Slide 27 text

が、それだけでは面白くないので 別のexporterを作ってきた

Slide 28

Slide 28 text

openweathermap_exporter

Slide 29

Slide 29 text

OpenWeatherMap 全世界の天気情報を公開 JSONを吐くAPIが存在

Slide 30

Slide 30 text

openweathermap_exporter APIから取得した気温等を出力するexporterを実装 した https://github.com/kaznishi/openweathermap_exp orter (実は車輪の再発明だが他に良いネタが思いつかな かった)

Slide 31

Slide 31 text

結果

Slide 32

Slide 32 text

ここ数日の気温がモニタリングできた! (可視化にはGrafanaを使用)

Slide 33

Slide 33 text

まとめ exporterの自作は難しくない! みなさんも機会があればexporter作ってみて下さい

Slide 34

Slide 34 text

おわり