Upload
sugawara-genki
View
1.642
Download
0
Embed Size (px)
DESCRIPTION
cloudpack night #10での発表資料です
Citation preview
CloudWatch Logsを普通に使う
クックパッド株式会社菅原元気
お前誰よ
菅原元気@sgwr_dts / http://so-wh.at/
● Ruby / AWS
● https://bitbucket.org/winebarrel
● https://github.com/winebarrel
● 白金台の方から来ました
最近のアクティビティ
便利スキーマ管理ツールを作りましたhttps://github.com/winebarrel/ridgepole
増床おめでとうございます
いやーいいオフィスですね(予想)
アジェンダ
CloudWatch Logsの話をします
CloudWatch Logsとは
CloudWatch Logs
汎用的なログ収集サービス● ログ収集● グラフ化● 通知
CloudWatch Logs
シンプルなサービスです
CloudWatch Logs
ユースケース● ログを使ったエラー監視
CloudWatch Logs
ユースケース● ログを使ったエラー監視…ぐらい?
CloudWatch Logs
微妙なところ● ログ取得がストリーム単位
CloudWatch Logs
微妙なところ● ログ取得がストリーム単位
●検索機能がない
CloudWatch Logs
9/2現在、ログの収集先はus-east-1のみただしイベントの投稿はどこからでも可能
CloudWatch Logs
各種クライアント● CloudWatch Logs Agenthttps://s3.amazonaws.com/aws-
cloudwatch/downloads/latest/awslogs-agent-setup.py
● AWS CLIhttp://docs.aws.amazon.com/cli/latest/reference/logs/index.html
● fluentdhttps://github.com/ryotarai/fluent-plugin-cloudwatch-logs
● APIhttp://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.ht
ml
groupとstreamについて
log group / log stream
log group / log stream
● ログはlog groupごとに処理o 可視化・グラフ化・監視o API上ではstream毎にログの取得は可能
● log groupにlog streamが属するo プログラムはlog streamにイベントを投げるo 1スレッド→1ストリーム
使い方
AWS CLI
環境変数の設定(またはクレデンシャルファイルを設定)
$ export AWS_ACCESS_KEY_ID=...
$ export SECRET_ACCESS_KEY=...
$ export AWS_DEFAULT_REGION=us-east-1
AWS CLI
log groupの作成$ aws logs create-log-group --log-group-name my-group
$ aws logs describe-log-groups | jq '.logGroups[] | select(.logGroupName == "my-group")'
{
"storedBytes": 0,
"arn": "arn:aws:logs:us-east-1:XXX:log-group:my-group:*",
"logGroupName": "my-group",
"creationTime": 1409629885412,
"metricFilterCount": 0
}
AWS CLI
log streamの作成$ aws logs create-log-stream --log-group-name my-group --log-stream-name my-stream
$ aws logs describe-log-streams --log-group-name my-group
{
"logStreams": [
{
"creationTime": 1409630168044,
"logStreamName": "my-stream",
"arn": "arn:aws:logs:us-east-1:822997939312:log-group:my-group:log-stream:my-stream",
"storedBytes": 0
}
]
}
AWS CLI
イベントの投稿$ aws logs put-log-events ¥
> --log-group-name my-group --log-stream-name my-stream ¥
> --log-events ¥
> timestamp=1409630448000,message="Test event 1" ¥
> timestamp=1409630448001,message="Test event 2"
{
"nextSequenceToken": "49540113588536892459580435126484523626194989597679702066"
}
AWS CLI
イベントの投稿(二回目)$ aws logs put-log-events ¥
> --sequence-token 49540113588536892459580435126484523626194989597679702066 ¥
> --log-group-name my-group --log-stream-name my-stream ¥
> --log-events ¥
> timestamp=1409630448003,message="Test event 3" ¥
> timestamp=1409630448004,message="Test event 4"
{
"nextSequenceToken": "49540113588536892459580435126797635413475185494595751986"
}
AWS CLI
イベントの投稿● 1回のAPIコールで複数のイベントを投稿可能● timestampはミリ秒を含むUNIX time
● streamへの2回目以降の投稿にはsequence
tokenが必要o 複数のスレッドから同じstreamの投稿はsequence
tokenの同期が必要
AWS CLI
イベントの取得$ aws logs get-log-events --log-group-name my-group --log-stream-name my-stream
{
"nextForwardToken": "f/31435809445027774223220423298428344103348277957912231937",
"events": [
{
"ingestionTime": 1409630516068,
"timestamp": 1409630448000,
"message": "Test event 1"
},
{
"ingestionTime": 1409630516068,
"timestamp": 1409630448001,
"message": "Test event 2"
},
…
AWS CLI
コンソール
CloudWatch Logs Agent
某社のブログを参照してください。http://dev.classmethod.jp/cloud/aws/amazon-
cloudwatch-logs/
CloudWatch Logs Agent
Agent便利なんですかねぇ…
便利機能
グラフ化
Metric Filterによりグラフ化http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CountingLogEventsExample.html
log groupにフィルタを作成することで、ログ(イベント)ごとにメトリクスを記録できる
グラフ化
metricName
CloudWatchのメトリック名metricNamespace
メトリックのネームスペースmetricValue
メトリックを記録するときの値。”1”なら1イベントにつき”1”が記録される。文字列も可http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_MetricTransformation.html
$ aws logs put-metric-filter ¥
> --log-group-name my-group ¥
> --filter-name my-filter ¥
> --filter-pattern '' ¥
> --metric-transformations ¥
> metricName=EventCount,metricNamespace=YourNamespace,metricValue=1
グラフ化
フィルターhttp://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html
filter patterの指定により特定の条件をメトリックとして記録できる
フィルター
127.0.0.1 - frank [10/Oct/2000:13:25:15 -0700] "GET /apache_pb.gif HTTP/1.0" 200 1534
127.0.0.1 - frank [10/Oct/2000:13:35:22 -0700] "GET /apache_pb.gif HTTP/1.0" 500 5324
127.0.0.1 - frank [10/Oct/2000:13:50:35 -0700] "GET /apache_pb.gif HTTP/1.0" 200 4355
[ip, user, username, timestamp, request, status_code, bytes > 1000]
[ip, user, username, timestamp, request, status_code = 200, bytes]
[ip, user, username, timestamp, request, status_code = 4*, bytes]
[ip, user, username, timestamp, request = *html*, status_code = 4*, bytes]
$ aws logs put-metric-filter ¥
> --log-group-name my-group ¥
> --filter-name my-filter ¥
> --filter-pattern '' ¥
> --metric-transformations ¥
> metricName=EventCount,metricNamespace=YourNamespace,metricValue=1
フィルター
● 空白区切りの構造化文字列として解釈● ダブルクォート(“)、角括弧([])はグループ化
o シングルクォート(‘)、普通の括弧()、中括弧{}はグループ化されない
● 「...」で適当に省略してくれるo [..., status_code = 200, bytes]
末尾のstatus_codeが200
フィルター
マッチングはCLIでテストできるトの取得~$ aws logs test-metric-filter ¥
> --filter-pattern '[...]' ¥
> --log-event-messages '127.0.0.1 - frank [10/Oct/2000:13:25:15 -0700] "GET /apache_pb.gif HTTP/1.0" 200 1534'
{
"matches": [
{
"eventNumber": 1,
"eventMessage": "127.0.0.1 - frank [10/Oct/2000:13:25:15 -0700] ¥"GET /apache_pb.gif HTTP/1.0¥" 200 1534",
"extractedValues": {
"$6": "200",
"$7": "1534",
"$4": "10/Oct/2000:13:25:15 -0700",
"$5": "GET /apache_pb.gif HTTP/1.0",
"$2": "-",
"$3": "frank",
"$1": "127.0.0.1"
}
}
]
}
fluentdとの連携
fluent-plugin-cloudwatch-logs
https://github.com/ryotarai/fluent-plugin-cloudwatch-logs
● @ryot_a_rai先生作● Input / Output 両方対応
o Inputは全然検証してません
fluent-plugin-cloudwatch-logs
<match cloudwatch_logs.**>
type cloudwatch_logs
log_group_name my-group
log_stream_name my-stream
auto_create_stream true
message_keys message
#use_tag_as_group false
</match>
$ echo '{"message":"item1 item2 item3"}' | fluent-cat cloudwatch_logs.test
fluent-plugin-cloudwatch-logs
● log group / log streamは自動作成可能● sequence tokenはメモリに記録
fluent-plugin-cloudwatch-logs
● “message_keys”を指定しないとJSONとして投稿されるo フィルターの動作を考えると指定した方がよい
管理ツール作りました
Radiosonde / Meteorlog
「AWSコード化」シリーズ● Radiosonde
o CloudWatchのAlartの管理
● Meteorlogo CloudWatch Logsの管理
Meteorloghttps://github.com/winebarrel/meteorlog
log_group "any-group" do
log_stream "my-stream"
# Please write the following if you do not want to manage log_streams
#any_log_streams
metric_filter "MyAppAccessCount" do
# see http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/FilterAndPatternSyntax.html
filter_pattern '[ip, user, username, timestamp, request, status_code, bytes > 1000]'
metric :name=>"EventCount", :namespace=>"YourNamespace", :value=>"1"
end
metric_filter "MyAppAccessCount2" do
metric :name=>"EventCount2", :namespace=>"YourNamespace2", :value=>"2"
endend
Radiosonde / Meteorlog
Radiosonde / Meteorlog
Radiosondehttps://github.com/winebarrel/radiosonde
alarm "alarm1" do
namespace "AWS/EC2"
metric_name "CPUUtilization"
dimensions "InstanceId"=>"i-XXXXXXXX"
period 300
statistic :average
threshold ">=", 50.0
evaluation_periods 1
actions_enabled true
alarm_actions []
ok_actions []
insufficient_data_actions ["arn:aws:sns:us-east-1:123456789012:my_topic"]end
Radiosonde / Meteorlog
便利ですよ
まとめ
まとめ
● CloudWatch Logsは便利
まとめ
● CloudWatch Logsは便利…そうな雰囲気があります
まとめ
● CloudWatch Logsは便利…そうな雰囲気があります
●検索機能欲しい