vague memory

うろ覚えを無くしていこうともがき苦しむ人の備忘録

Datadog AWSインテグレーション用 CloudFormationテンプレート

ありそうでなかったので作成。(見つけられないだけでしょうか)

github.com


雑記

Datadog AWS Integration 設定(IAM Role) - Qiita の焼き直しです。 権限部分をコピペして作れるようにしたかったのと、更新箇所把握しておきたかったのでリポジトリ化。ほぼ自分用です。

AWS、Datadog双方の都合で付与権限は変わるようなので、それなりの頻度で権限部分の更新が入ります。 公式でドキュメント更新だけでなく、テンプレートなりポリシードキュメントなり配布するようになると良いと思います。

CloudFormation YAMLの関数名は短縮形の構文が使用できますが、サードパーティ系のツールが非対応の物があるため敢えて使っていません。 短縮形だと想定した動作にならず小一時間悩みました。

Datadog で AWS SNS を受け取る (RDS/ElastiCacheイベント)

AWSSNS トピックを Datadog で直接サブスクライブできます。 ドキュメント通りなんですが、どのような感じで通知されるのかを残しておきます。

一応受信用 Email を払い出して受信することもできます。



設定

SNS

AWS SNS で Topic と Subscription を作成します。
Endpoint には Datadog の Webhook URL を指定します。

https://app.datadoghq.com/intake/webhook/sns?api_key=<API KEY>

f:id:htnosm:20180413151001p:plain

Event設定例

RDS/ElastiCache の Event を飛ばしてみます。 (Datadog AWSインテグレーションで既に Events に通知されていますが、明示的に SNS -> Datadog への通知を行います)

f:id:htnosm:20180413151002p:plain

RDS Events

[Event subscriptions] に Topic を設定します。

f:id:htnosm:20180413151003p:plain

ElastiCache Events

RDSと異なり全体の通知設定は無く、各 Cluster 個別に Topic を設定します。

f:id:htnosm:20180413151004p:plain

受信例

f:id:htnosm:20180413152131p:plain

Event Monitor から Slack への通知例

  • Monitor

確認用に変数埋め込んでいますが、無い方が見易いです。 f:id:htnosm:20180413151006p:plain

  • RDS

f:id:htnosm:20180413151007p:plain

  • ElastiCache

f:id:htnosm:20180413151008p:plain

Datadog Logs(パブリックベータ) ログ解析と通知

Datadog でのログ管理機能(パブリックベータ版)での検証履歴です。 今回は[Logs]->[Explorer]、[Logs]->[Pipelines] 部分を確認します。

また、公開当時は無かった Log Monitor (通知機能) も実装されていますので併せて試します。


目次


Explorer

検索用の画面です。 ここでの条件付与の為に後述 Pipeline で、表示列(column)や絞り込み条件(facet)を作成します。

Pipelines

デフォルト状態で Apache、Nginx、Java の Pipeline が設定されていました。 今後標準的なログの Pipeline は増えていくのかもしれません。

既存 Pipeline からの複製(clone)が行えます。clone元は無効化された状態となります。 (新規作成ももちろん可能です)

f:id:htnosm:20180329015647p:plain

Pipeline filters

facets や tag を利用して、Pipeline の対象とするログの絞り込み設定をします。

Processors

Pipeline filters で絞り込みをしたログに対する変換処理を定義します。

Grok で解析・抽出し、リマッパーに渡して属性に割り当てるが基本的な流れになります。詳細は公式参照で、以下メモです。

  • Grok Parser
    • Logstash で利用される Grok filter を用いて解析を行う。
  • Log Date Remapper
    • ログのタイムスタンプを定義
    • 未定義の場合はDatadogがログを受信した日時となる
  • Log Status Remapper
    • level を定義
    • Explorer上の Status に反映される
    • 整数は syslog Severity_level に対応
    • 文字列は後述 Status Remapper 対応表 参照
  • Attribute Remapper
    • 任意の属性を別属性に再割当て
  • URL Parser
    • URLを解析しパラメータ抽出
    • Gork Parser 内でも url フィルタとして実装
  • Useragent parser
    • User Agent を解析しパラメータ抽出
    • Gork Parser 内でも useragent フィルタとして実装

Status Remapper 対応表

  • 大文字小文字の区別無し
  • 該当しないものは全て info(6) にマップ
開始文字列 割当キーワード 対応値 重大度(Severity)
emerg または f emerg 0 緊急(Emergency)
a alert 1 アラート(Alert)
c critical 2 クリティカル(Critical)
err error 3 エラー(Error)
w warning 4 警告(Warning)
n notice 5 通知(Notice)
i info 6 情報(Informational)
d または trace または verbose debug 7 デバッグ(Debug)
ok または success に一致 OK

制限

サイズ制限等があるため下記最新情報を参照。

解析(ParsingRule)例

既存のログを使用し、いくつか解析を試してみます。

尚、 Pipeline 設定を更新した場合、過去に取り込み済みのログには適用されません。 Pipeline 更新以降に取り込まれたログから適用されます。

jenkins.log

JenkinsParsingRule %{date("MMM dd, yyyy H:mm:ss"):datestr} %{regex("[AP]M"):meridian} %{notSpace:class} %{word:method}[\n| ]%{word:level}: %{data:message}

f:id:htnosm:20180329015649p:plain

messages

messages %{date("MMM d HH:mm:ss"):datestr} %{notSpace:host} %{word:program}(\[%{integer:processid}\])?:%{data:message}

f:id:htnosm:20180329015648p:plain

maillog(stat=を含む行のみ)

maillogstat %{date("MMM d HH:mm:ss"):datestr} %{notSpace:host} %{data:program}(\[%{integer:processid}\])?: %{word:messageid}: %{data::keyvalue("="," /()\\[\\]:")}stat=%{word:stat}: %{data:message}

f:id:htnosm:20180329015650p:plain

Monitor

閾値超過でのアラート通知を行えます。

"ERROR" を含むログが n 件出力されたらアラート の通知はできますが、 "ERROR" を含むログの内容 の通知機能は今の所ありません。

  • [Monitors]->[New Monitor]->[Logs]

f:id:htnosm:20180329015651p:plain

設定自体は他のMonitorと同様です。

f:id:htnosm:20180329015652p:plain

尚、バグなのか仕様なのか不明ですが、 現在、閾値(threshold)は 1 以上しか設定できない(0は入力を受け付けない)ため、1件での検知をしたい場合は above or equal to 1 で設定する必要があります。

Slackへの通知例

クエリが通知先と認識されてしまっていますが、通知イメージです。

f:id:htnosm:20180329015653p:plain


LogMonitor はまだテスト実装な感じを受けました。

Datadog Logs(パブリックベータ) ログ収集設定

Datadog logs(パブリックベータ) を試してみる の続きで、 Datadog でのログ管理機能(パブリックベータ版)での検証履歴です。

htnosm.hatenablog.com

今回はログを送信する側での除外、置換、複数行を確認します。


目次


ログ収集設定

基本的な設定値

  # 必須
  - type: 入力タイプ (tcp/udp/file)
    # 入力タイプにより port/path のいずれか
    #port: tcp/udpの場合、ポート指定
    path: file の場合、対象ログファイルのフルパス
    service: 所有サービス名
    source: インテグレーション名、カスタムログの場合は任意文字列(カスタムメトリクス名に合わせるのが推奨との記載有り)
  # オプション
    sourcecategory: 絞り込み用オプション
    tags: タグ付け(カンマ区切り)

ログのタグには、収集対象のホストに付与されているタグも自動的に付与されます。

f:id:htnosm:20180328220426p:plain

インテグレーションのログ収集設定

Datadog コンソール上で、設定方法と設定ファイルの例が参照できます。

  • [Logs]->[Docs]

f:id:htnosm:20180328220421p:plain

もしくは、Datadog Agent インストールした際に作成される各exampleにも記載があります。

  • /etc/datadog-agent/conf.d/apache.d/conf.yaml.example 等

未サポートのログ収集設定

Datadog コンソール上で、今後実装予定のインテグレーションが参照できます。

  • [Logs]->[Docs]->[Server]->[Other] 等

インテグレーション追加のリクエストを送る事もできるようです。

f:id:htnosm:20180328220422p:plain

Advanced log collection functions (収集ルール)

log_processing_rules ディレクティブでDatadogへ転送するログの詳細設定を行います。

以下、各ruleの利用例です。ログファイルは dd-agent ユーザでの読み込みが行える状態にしてあります。

exclude_at_match

除外設定です。パターンに一致するログの送信を行いません。 debug,info レベルのログは送信しない等で利用できます。

  • /var/log/messages から ansible を含む行を除外する例
logs:
  - type: file
    path: /var/log/messages
    service: syslog
    source: os
    sourcecategory: system
    tags: log_type:file,rule_type:exclude_at_match
    log_processing_rules:
      - type: exclude_at_match
        name: exclude_ansible
        ## Regexp can be anything
        pattern: \sansible.*:\s

送受信例

  • ログ例
Mar 28 hh:mm:ss ip-xxx-xxx-xxx-xxx ansible-setup: Invoked with filter=* gather_subset=['all'] fact_path=/etc/ansible/facts.d gather_timeout=10
  • Datadog 側
    • 除外されるため表示されない

include_at_match

ログ抽出設定です。 exclude_at_matchの逆で、パターンに一致するログのみを送信します。
例は mask_sequences の項へ記載します。

mask_sequences

パターンに一致する文字列のマスクを行います。

  • /var/log/maillog から stat= を含む行のみを抽出、メールアドレスをマスクする例
logs:
  - type: file
    path: /var/log/maillog
    service: maillog
    source: os
    sourcecategory: system
    tags: log_type:file,rule_type:include_at_match,rule_type:mask_sequences
    log_processing_rules:
      - type: include_at_match
        name: include_maillog_stat
        ## Regexp can be anything
        pattern: \sstat=.*?\s
      - type: mask_sequences
        name: mask_mailaddress
        replace_placeholder: " to=[mask_mailaddress], "
        ##One pattern that contains capture groups
        pattern: \sto=.*?,\s

送受信例

  • ログ例
Mar 28 hh:mm:ss ip-xxx-xxx-xxx-xxx sendmail[24023]: xxxxxxxx024023: to=root, ctladdr=root (0/0), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=31183, relay=[127.0.0.1] [127.0.0.1], dsn=4.0.0, stat=Deferred: Connection refused by [127.0.0.1]
  • Datadog 側

f:id:htnosm:20180329024755p:plain

multi_line

複数行を1行のログに集約します。

  • jenkins.log を送信する例
    • 今後実装予定のようですが、Jenkinsのログ収集は現時点ではサポートされていません。
logs:
  - type: file
    path: /var/log/jenkins/jenkins.log
    service: jenkins
    source: java
    sourcecategory: sourcecode
    tags: log_type:file,rule_type:multi_line
    #For multiline logs, if they start with a timestamp with format yyyy-mm-dd uncomment the below processing rule
    log_processing_rules:
      - type: multi_line
        pattern: \w{3}\s(0?[1-9]|[1-3][0-9]),\s\d{4}
        name: new_log_start_with_date

送受信例

  • ログ例
Mar 28, 2018 4:53:51 PM hudson.model.AsyncPeriodicWork$1 run
INFO: Started Fingerprint cleanup
  • Datadog 側

f:id:htnosm:20180328220424p:plain

StackTraceも同様

f:id:htnosm:20180328220425p:plain


ワイルドカードでの収集は割愛。 送信イメージは掴めた気がします。

AWS Athena 別リージョンS3でのエラー

QuickSight を使おうとした際に当たったエラーです。 QuickSight は現在東京リージョンでの提供が無いため、オレゴンリージョンから東京リージョンのS3を参照しました。

Athenaでのクエリ実行時に以下エラーメッセージが出力されます。(同一リージョンであれば問題無いです)

HIVE_CURSOR_ERROR: The bucket is in this region: null. 
Please use this region to retry the request
(Service: Amazon S3; Status Code: 301; Error Code: PermanentRedirect;

f:id:htnosm:20180301073027p:plain

暗号化されている場合は、S3とAthenaは同一リージョンにする必要があります。

If the data is encrypted in Amazon S3, it must be stored in the same region, and the user or principal who creates the table in Athena must have the appropriate permissions to decrypt the data.

仕様です。
が、エラーメッセージが解り難いと感じました。

Neustar Website Load Testing のサンプルスクリプト(VirtualUser)生成

Neustar Website Load Testing

米国の Neustar 社が提供しているサービスの一つで、Webサイトに対する負荷試験が行えます。 日本ではあまり馴染みが無いようで情報が少ないです。

有償サービスです。30日間のトライアルがあります。コーポレートサイトからは以下のようにリンクを辿ると行き着きます。

有償サービスだけあって至れり尽くせりな感じなので、ある程度大きな規模、複雑なシナリオの負荷試験を行う場合は選択肢の一つになると思います。

  • 負荷試験スケジュール設定が容易
  • 実行ロケーションが豊富
  • 試験結果レポート自動生成
    • 結果データをMySQL形式でダウンロード可能

test script

負荷試験実行には実行するスクリプトを作成する必要があります。

以前は neustar_script_recorder により Selenium IDE からスクリプト生成ができましたが、 Firefox 55 からは Selenium IDE が動作しなくなっています。

f:id:htnosm:20180205031417p:plain

neustar の Scripting ページにあったリンクも既に消えています。

f:id:htnosm:20180205031418p:plain

スクリプトの公式ドキュメントは以下になりますが、一から作成するのは中々骨が折れます。

biz.neustar.wpm.api (Neustar Web Performance Management Scripting API)

VirtualUser

GETやPOSTコマンドを使用してHTTPトラフィックをシミュレートします。 対して RealUser は実際のブラウザを使用したテストを行えます。が、VirtualUserより割高です。

サンプルスクリプト生成

本題です。
負荷試験用のスクリプトを作成するに当たり、ベースとなるサンプルスクリプトを生成します。
Neustar のアカウント登録は済ませている必要があります。

  • Scripting Overview ページから [CREATE SAMPLE SCRIPT]

f:id:htnosm:20180205031419p:plain

  • 対象URLを入力

f:id:htnosm:20180205031420p:plain

Google先生にご協力いただいています。

f:id:htnosm:20180205031421p:plain

この時点では RealUser 用のスクリプトです。 以下のようなスクリプトとなります(コメント行を除外したもの)。 openBrowser を基点としています。

var driver = openBrowser();
var c = driver.getHttpClient();
c.blacklistCommonUrls();
beginTransaction(function() {
    beginStep("Check Website", 30000, function() {
        driver.get("https://google.com");
        waitForNetworkTrafficToStop(2000, 15000);
    });
});
  • ページ下部にある [GENERATE BASIC SCRIPT] で VirtualUser 用に変換

f:id:htnosm:20180205031422p:plain

そのまま押下すると名前重複エラーとなるため、Name: に任意の名前を入力後、 [GENERATE BASIC SCRIPT] を押下します。

f:id:htnosm:20180205031423p:plain

変換されたものが別スクリプトとして作成されます。

以下のようなスクリプトとなります(一部抜粋)。 openHttpClient を基点としています。

var c = test.openHttpClient();
c.setFollowRedirects(false);
test.beginTransaction();
test.beginStep("Check Website");
c.get("https://google.com/", 301);
c.get("https://www.google.com/", 200);
c.get("https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128.3-s.png", 200);
c.get("https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128-l.png", 200);
c.get("https://ssl.gstatic.com/gb/images/i1_1967ca6a.png", 200);
c.get("https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/am=wCLkeMEBEP8TgogEKwgsSAphGBA/rt=j/d=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ", 200);
var req = c.newPost("https://www.google.com/gen_204?s=webaft&atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&rt=wsrt.574,aft.263,prt.118");
req.setRequestBody("", "text/plain", "UTF-8");
req.execute();
c.get("https://www.google.com/textinputassistant/tia.png", 200);
c.get("https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=d3l,aa,abd,async,dvl,foot,fpe,ifl,ipv6,lu,m,mu,sf,sonic/am=wCLkeMEBEP8TgogEKwgsSAphGBA/exm=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/rt=j/d=1/ed=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ?xjs=s1", 200);
c.get("https://www.gstatic.com/og/_/js/k=og.og2.en_US.1KX-mFknZ_0.O/rt=j/m=def/exm=in,fot/d=1/ed=1/rs=AA2YrTuYBNXI2WfsWOZ7BwnBUE80MWT3Og", 200);
c.get("https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.HtLvrA_npCQ.O/m=gapi_iframes,googleapis_client,plusone/rt=j/sv=1/d=1/ed=1/am=AAE/rs=AHpOoo8wHQU_A1WtgGgcOpQEfGjHuD8e-g/cb=gapi.loaded_0", 200);
c.get("https://www.google.com/images/nav_logo242.png", 200);
var req = c.newPost("https://www.google.com/gen_204?atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&s=webhp&imc=3&imn=3&imp=3&adh=&ima=2&ime=0&rt=aft.263,dcl.211,iml.263,ol.796,prt.118,xjs.529,xjsee.529,xjses.331,xjsls.176,wsrt.574,cst.0,dnst.0,rqst.266,rspt.302,rqstt.286,unt.249,cstt.249,dit.717&zx=1517710556974");
req.setRequestBody("", "null", "UTF-8");
req.execute();
c.get("https://adservice.google.com/adsid/google/ui", 204);
var req = c.newPost("https://shavar.services.mozilla.com/downloads?client=navclient-auto-ffox&appver=45.9.0&pver=2.2");
req.setRequestBody("mozstd-track-digest256;
mozstd-trackwhite-digest256;
", "text/plain", "UTF-8");
req.execute();
c.get("https://tracking-protection.cdn.mozilla.net/mozstd-track-digest256/1512580265", 200);
c.get("https://tracking-protection.cdn.mozilla.net/mozstd-trackwhite-digest256/1512580265", 200);
test.endStep();
test.endTransaction();

Validation Status: Invalid となっている通り、そのままだと実行できません。 残念ながら変換処理は完全な物では無いようです。

  • [View Validation Results] からエラー参照

f:id:htnosm:20180205031424p:plain

エラー内容に従いスクリプトを修正して、Validationを通します。

$ diff check.google.com.basic.js.org check.google.com.basic.js
37,38c37,38
< c.get("https://google.com/", 301);
< c.get("https://www.google.com/", 200);
---
> c.get("https://google.com/", 302);
> c.get("https://www.google.com/", 302);
56,58c56
< req.setRequestBody("mozstd-track-digest256;
< mozstd-trackwhite-digest256;
< ", "text/plain", "UTF-8");
---
> req.setRequestBody("mozstd-track-digest256; mozstd-trackwhite-digest256; ", "text/plain", "UTF-8");
  • [REVALIDATE]

f:id:htnosm:20180205031425p:plain

正常に実行できると実行結果を参照できます。

f:id:htnosm:20180205031426p:plain

Local Validator

VALIDATE をローカルで実行するツールが用意されています。

f:id:htnosm:20180205031427p:plain

ローカルで VALIDATE を通した後、Neustar上で VALIDATE を通すのが基本になるかと思います。 NeustarのWEB画面はお世辞にも軽いとは言えないので、何度も実行する事を考えると辛いです。

  • 実行例
# ダウンロードした local-validator.tar.gz を解凍後
# ./bin/validator "ScriptFile"

$ ./bin/validator check.google.com.basic.js
Neustar Web Performance Script Validator 4.27.33
Copyright (c) Neustar Inc - All Rights Reserved.
VNC Support is NOT Available
INFO 02/04 17:49:59 b.n.w.a.s.JavaScrip~ - LITE mode starting up
INFO 02/04 17:49:59 b.n.w.a.s.JavaScrip~ - Starting script executor 0
INFO 02/04 17:49:59 b.n.w.a.a.Webmetric~ - Using DNS Server: [10.0.2.4, 10.0.130.4]
INFO 02/04 17:50:04 b.n.w.a.s.JavaScrip~ - Script complete.
INFO 02/04 17:50:04 b.n.w.v.ValidationR~ - Saving validation logs to 'validation.txt'...
INFO 02/04 17:50:04 b.n.w.v.ValidationR~ - Saving Http Archive(HAR) to 'har.js'...

# 結果確認
$ cat validation.txt
***** TEST PASSED *****
=====================================================
Script Log
=====================================================
Tip: Calls to test.log('text') will log the supplied text to this field - great for debugging!

=====================================================
Transaction information
=====================================================
Start: Mon Feb 04 17:21:13 JST 2018
End: Mon Feb 04 17:21:20 JST 2018
Time Active: 6917ms
Time Paused: 0ms
Bytes Transfered: 1195973
Total Steps: 1


=====================================================
Check Website, 1
=====================================================
Start: Mon Feb 04 17:21:13 JST 2018
End: Mon Feb 04 17:21:20 JST 2018
Time Active: 6909ms
Time Paused: 0ms
Bytes Transferred: 1195973
Total Objects: 17

    272b    302 467ms   https://google.com/
    272b    302 505ms   https://www.google.com/
    4480b   200 143ms   https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128.3-s.png
    42566b  200 280ms   https://www.google.com/logos/doodles/2018/elizabeth-blackwells-197th-birthday-5658618786480128-l.png
    7325b   200 147ms   https://ssl.gstatic.com/gb/images/i1_1967ca6a.png
    424795b 200 721ms   https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/am=wCLkeMEBEP8TgogEKwgsSAphGBA/rt=j/d=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ
    0b  204 164ms   https://www.google.com/gen_204?s=webaft&atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&rt=wsrt.574,aft.263,prt.118
    258b    200 129ms   https://www.google.com/textinputassistant/tia.png
    74553b  200 198ms   https://www.google.com/xjs/_/js/k=xjs.s.en_US.raf7LOu-P_4.O/m=d3l,aa,abd,async,dvl,foot,fpe,ifl,ipv6,lu,m,mu,sf,sonic/am=wCLkeMEBEP8TgogEKwgsSAphGBA/exm=sx,sb,cdos,cr,elog,hsm,jsa,r,d,csi/rt=j/d=1/ed=1/t=zcms/rs=ACT90oE6NwsHXuZlmER-n1nX33KRrVCWFQ?xjs=s1
    138813b 200 629ms   https://www.gstatic.com/og/_/js/k=og.og2.en_US.1KX-mFknZ_0.O/rt=j/m=def/exm=in,fot/d=1/ed=1/rs=AA2YrTuYBNXI2WfsWOZ7BwnBUE80MWT3Og
    138670b 200 1034ms  https://apis.google.com/_/scs/abc-static/_/js/k=gapi.gapi.en.HtLvrA_npCQ.O/m=gapi_iframes,googleapis_client,plusone/rt=j/sv=1/d=1/ed=1/am=AAE/rs=AHpOoo8wHQU_A1WtgGgcOpQEfGjHuD8e-g/cb=gapi.loaded_0
    16786b  200 198ms   https://www.google.com/images/nav_logo242.png
    0b  204 299ms   https://www.google.com/gen_204?atyp=csi&ei=3mx2WrTeFOrA5gLhtIjABQ&s=webhp&imc=3&imn=3&imp=3&adh=&ima=2&ime=0&rt=aft.263,dcl.211,iml.263,ol.796,prt.118,xjs.529,xjsee.529,xjses.331,xjsls.176,wsrt.574,cst.0,dnst.0,rqst.266,rspt.302,rqstt.286,unt.249,cstt.249,dit.717&zx=1517710556974
    0b  204 514ms   https://adservice.google.com/adsid/google/ui
    162b    400 578ms   https://shavar.services.mozilla.com/downloads?client=navclient-auto-ffox&appver=45.9.0&pver=2.2
    57526b  200 411ms   https://tracking-protection.cdn.mozilla.net/mozstd-track-digest256/1512580265
    289495b 200 405ms   https://tracking-protection.cdn.mozilla.net/mozstd-trackwhite-digest256/1512580265

WPM API

Neustar のWeb画面での各種操作(スクリプトやテスト実行)のAPIもあります。

まとめ

Neustar自体は負荷試験を欠ける側に気を使わなくて良いのは利点ですが、想定通りのテスト実行までの道のりは結構長く感じます。
実際の負荷試験シナリオはもっと複雑になるので、出力された物そのまま利用するだけでは不十分ですが、 取っ掛かりとしてサンプルスクリプト生成を行い修正していくのが楽なのかなと思います。

Datadog dogstream 注意点

ログ管理機能 ( Introducing logs in Datadog ) のリリースが控えていますが、地味にハマったので今更ながら dogstream での注意点を残しておきます。
ちなみにログ管理機能が含まれる予定の Agent version >= 6.0 からはパラメータ自体廃止されているようなので、6.0以降は機能が無くなるようです。
(カスタムメトリクスは DogStatsD 等の別手法で送信した方が良さそうです)



dogstream とは

ファイルに出力された値をメトリクスとして送信する機能です。

有効化

datadog.conf 内の dogstreams へ対象ログファイルを設定します。

dogstreams: /var/log/web.log, /var/log/db.log, /var/log/cache.log

公式ログフォーマット

metric unix_timestamp value [attribute1=v1 attributes2=v2 ...]

上記フォーマットに合致しないログについては、カスタムパーサを用意することで対応します。

注意点

本題です。 公式ドキュメントに記載はありますが、英語ページのみです。日本語ページには記載がありません。

A word of warning:
there is a limit to how many times the same metric can be collected in the same log-pass;
effectively the agent starts to over-write logged metrics with the subsequent submissions of the same metric,
even if they have different attributes (like tags).
This can be somewhat mitigated if the metrics collected from the logs have sufficiently different time-stamps,
but it is generally recommended to only submit one metric to the logs for collection once every 10 seconds or so.
This over-writing is not an issue for metrics collected with differing names.

同一ファイル内の同一メトリクス名での送信は値が上書かれる可能性があります。

以下のような形式でファイルへ出力していたとします。

# metric        unix_timestamp    value  attribute1           attribute2 attribute3
# ---------
publish_time    1514605081        593    metric_type=gauge    unit=ms    stage=prd
publish_time    1514605081        799    metric_type=gauge    unit=ms    stage=stg
publish_time    1514605083        693    metric_type=gauge    unit=ms    stage=stg
publish_time    1514605111        553    metric_type=gauge    unit=ms    stage=prd
publish_time    1514605111        588    metric_type=gauge    unit=ms    stage=stg
・・・

メトリクス名 publish_time とし、stageタグで系列分けが行えるようにします。 Datadog上での表示は以下のようになります。

f:id:htnosm:20180108015941p:plain

上書きが発生する場合

stage=prd の後に stage=stg が出力されているため、後者の値で上書きが発生します。 Datadog側に Datapoint として存在せず、送信できていないかのように見えます。

f:id:htnosm:20180108015954p:plain

公式ドキュメントによると10秒間に一度は出力する事が推奨とあります。 実際に、短時間(数秒)で出力されるログでは発生頻度は低かったですが、数十秒間隔の出力になるとほぼほぼ上書きが発生していました。

回避策

以下いずれかで回避可能です。

  • a) 数秒間隔で出力する
    • 上書きされる頻度は下がる
  • b) メトリクス名を分ける
    • グラフ作成時に複数メトリクス指定が必要になるので、属性(attribute)が増えてくると利用し難い
  • c) 出力ファイルを分ける
    • datadog.conf へ複数ファイル指定が必要