Goを使用してAWS Cloud Watchに独自のカスタムメトリックを挿入
17191 ワード
INTRO
こんにちは!
cloudwatchに自分のカスタムメトリックを加えたいです.
Aws SDKを見ていると、Metricを送信する方法があります.
私が作成した簡単なデータはCloudWatchが作成したデータと同じであることに気づきました.
どうやって作ったのか説明します
CloudWatch Agent内部の簡単な理解
AWS CloudWatch Agentはgithubで公開されているので,その内部コードをしばらく分析した.
次に、エージェントがTelegraf機能を使用していることがわかります.
ag, err := agent.NewAgent(c)
if err != nil {
return err
}
// Setup logging as configured.
logConfig := logger.LogConfig{
Debug: ag.Config.Agent.Debug || *fDebug,
Quiet: ag.Config.Agent.Quiet || *fQuiet,
LogTarget: ag.Config.Agent.LogTarget,
Logfile: ag.Config.Agent.Logfile,
RotationInterval: ag.Config.Agent.LogfileRotationInterval,
RotationMaxSize: ag.Config.Agent.LogfileRotationMaxSize,
RotationMaxArchives: ag.Config.Agent.LogfileRotationMaxArchives,
}
logger.SetupLogging(logConfig)
if *fTest || *fTestWait != 0 {
testWaitDuration := time.Duration(*fTestWait) * time.Second
return ag.Test(ctx, testWaitDuration)
}
log.Printf("I! Loaded inputs: %s", strings.Join(c.InputNames(), " "))
log.Printf("I! Loaded aggregators: %s", strings.Join(c.AggregatorNames(), " "))
log.Printf("I! Loaded processors: %s", strings.Join(c.ProcessorNames(), " "))
log.Printf("I! Loaded outputs: %s", strings.Join(c.OutputNames(), " "))
log.Printf("I! Tags enabled: %s", c.ListTags())
agentinfo.InputPlugins = c.InputNames()
agentinfo.OutputPlugins = c.OutputNames()
if *fPidfile != "" {
f, err := os.OpenFile(*fPidfile, os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Printf("E! Unable to create pidfile: %s", err)
} else {
fmt.Fprintf(f, "%d\n", os.Getpid())
f.Close()
defer func() {
err := os.Remove(*fPidfile)
if err != nil {
log.Printf("E! Unable to remove pidfile: %s", err)
}
}()
}
}
logAgent := logs.NewLogAgent(c)
go logAgent.Run(ctx)
return ag.Run(ctx)
ここです。に進むと、Telegrafエージェントを実行するコードが表示されます.Telegrafデータ収集方法
CloudWatchagentはTelegrafを利用してデータを収集しています.
では、Telegrafはどのようにデータを収集しているのでしょうか.
私もこの部分が気になってTelegrafの内部コードを開けました
Telegrafの場合、このオープンソースを使用して公制を収集することを決定することができます.
Go開発者にとって、これは使用可能なオープンソースライブラリです.
ここでお会いできて嬉しいです.
Telegrafでこのコードをどのように使用するかについては、ここです。を確認してください.
独自のカスタムMetricの作成
awssdkの場合、Cloudwatchにはmetricを直接生成して渡す関数が存在します.
メモリ情報を伝えるために利用できます.
作成する前に、NameSpaceについて理解する必要があります.
NameSpaceを複数の指標のスペースと見なしてください.
たとえば、instanceに関する指標がいくつかある場合は、Instance Name Spaceに配置したほうがいいです.
今から作りましょう
ライブラリをダウンロードします.
go get "github.com/tae2089/goAws"
上のライブラリはawsを使いやすいようにカスタマイズしたライブラリです:)今はs 3とcloud watchについての部分がありますハハ
ライブラリが閉じている場合は、コードを入力します.
コードは簡単です.
package main
import (
"github.com/tae2089/goAws/cloudwatch"
"time"
)
func main() {
instanceName := "<인스턴스이름>"
instanceId := "<인스턴스 id>"
c := cloudwatch.CloudwatchInfo{
AwsRegion: "<aws region>",
AwsAccessKey: "<AwsAccessKey>",
AwsSecretKey: "<AwsSecretKey>",
AwsInstanceName: instanceName,
AwsInstanceId: instanceId,
AwsProfileName: "default",
AwsNamespace: "<Namespace name>",
}
err := c.SetConfigByKey()
if err != nil {
panic(err)
}
for {
_, err := c.PutMetricData(cloudwatch.MemoryPercent)
if err != nil {
panic(err)
}
time.Sleep(1 * time.Second)
}
}
CloudWatchInfoに必要な領域、アクセスキー、秘密鍵、名前空間を入力します.アクセスキー、secretkeyを埋め込むユーザーの権限にはcloudwatchの権限が必要です.
このオプションを使用すると、次の結果が得られます.
最初の写真はnamespaceの内部に表示されます.
2枚目の写真は監視カメラを表示する写真です.
もし気になるところがあれば、伝言を残してください:)
Reference
この問題について(Goを使用してAWS Cloud Watchに独自のカスタムメトリックを挿入), 我々は、より多くの情報をここで見つけました https://velog.io/@tae2089/AWS-Cloud-Watch에-나만의-커스텀-Metric-넣어보기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol