go-datadog-api
Golang で実装された Datadog API のラッパーです。
使ってみた
準備
$GOPATH
等は設定済みの状態です。
go get gopkg.in/zorkian/go-datadog-api.v2
monitors を取得するやつ
GetMonitors() 関数を利用すれば良いようです。
package main import ( "log" "gopkg.in/zorkian/go-datadog-api.v2" ) func main() { client := datadog.NewClient("api key", "application key") mons, err := client.GetMonitors() if err != nil { log.Fatalf("fatal: %s\n", err) } for _, mon := range mons { log.Printf("Monitor %d: %s\n", mon.GetId(), mon.GetName()) } }
monitor の各要素は GetId()
や GetName()
等のメソッドを利用すれば取得出来るようです。
ところが
以下のようなエラーが出ちゃいます。
$ go run dd-monitors.go 2017/07/09 17:22:03 fatal: json: cannot unmarshal string into Go struct field Options.evaluation_delay of type int exit status 1
取得した monitor の evaluation_delay
というキーの値について、意図した値(型は int
)が入っていない為、JSON の解析に失敗しているようです。この事象については、以下の issue でやりとりされていました。
evaluation_delay
に値が入っていない場合の処理については、こちらのプルリクエストで Merge はされているので、近日中には Merge された内容でリリースされるんぢゃないかなーと期待しております。
ということで
monitor の取得については
もう少々待ちたいと思います。当然、evaluation_delay
に値が設定されている場合や evaluation_delay
がそもそも設定されていない monitor の場合には、以下のように monitor の各要素を取得することは出来ています。
$ cat dd-monitors.go package main import ( "log" "gopkg.in/zorkian/go-datadog-api.v2" ) func main() { client := datadog.NewClient("api key", "application key") mon, err := client.GetMonitor(12345678) if err != nil { log.Fatalf("fatal: %s\n", err) } log.Printf("Monitor %d: %s\n", mon.GetId(), mon.GetName()) } $ go run dd-monitors.go 2017/07/09 17:51:12 Monitor 12345678: Apache Log Monitor 40x Error Test
そもそも evaluation_delay とは
Datadog API ドキュメントには以下のように書かれています。
evaluation_delay
Time (in seconds) to delay evaluation, as a non-negative integer. For example, if the value is set to 300 (5min), the timeframe is set to last_5m and the time is 7:00, the monitor will evaluate data from 6:50 to 6:55. This is useful for AWS CloudWatch and other backfilled metrics to ensure the monitor will always have data during evaluation.
ざっくりと意訳すると…
- メトリクスを遅延評価するオプション
- 秒で設定する
- CloudWatch 等のメトリクスで評価するモニタにおいてデータを常に確保したい場合に設定すると良い
CloudWatch のメトリクスを取得する際に NO DATA になってしまうことを防げるのかもしれないですが、使ったことが無いのでなんとも言えません。すいません。
Golang で JSON パースのちょっと入門
encoding/json を使ったチュートリアル
Golang で JSON パースについてはちゃんと書こうとすると 1 つの記事になってしまうんだろうけど、ひとまず encoding/json パッケージを使ったチュートリアルをしてみます。
参考
シンプルに纏まっていて解りやすかったです。有難うございましたmm
基本
そもそも構造体って?
1つもしくは複数の値をまとめて格納できる型。それぞれのメンバ(フィールド)は型が異なっていてもよい点が配列と異なる。
なるほど。(今更感)
以下のサンプルで言うと、
type SelfIntroduction struct { Name string `json:"name"` Options []Options `json:"options"` }
これが構造体。
サンプル
参考サイトのサンプルスクリプトを拝借させて頂いて自己紹介スクリプトを self-introduction.go として保存しておきます。
package main import ( "encoding/json" "fmt" ) type SelfIntroduction struct { Name string `json:"name"` Options []Options `json:"options"` } type Options struct { Name string `json:"name"` Value json.Number `json:"value"` } func main() { json := ` { "name": "ハゲ", "options": [ { "name": "髪", "value": "つるっぱげ" }, { "name": "age", "value": 40 } ] } ` jsonBytes := ([]byte)(json) data := new(SelfIntroduction) if err := json.Unmarshal(jsonBytes, data); err != nil { fmt.Println("JSON Unmarshal error:", err) return } fmt.Println("Name: " + data.Name) for _, option := range data.Options { fmt.Printf("%s: %s\n", option.Name, option.Value) } }
実行してみます。
$ go run self-introduction.go
Name: ハゲ
髪: つるっぱげ
age: 40
おお、ちゃんと解析出来ています。
まだまだ Golang で JSON を扱う上で色々と学ぶ必要が有りそうなので、追々チュートリアルしていきます。
ということで
go-datadog-api から始まって、evaluation_delay
を経由して Golang の JSON パースまで薄く触れてみました。引き続き、チュートリアルな夏は続きます。