2

Sumologic でログを記録しました。ログ JSON には、要求の応答時間が含まれています。「response_time」という名前の JSON キーにします。各リクエストは、JSON キー「request_id」で示される一意の ID によって識別されます。および JSON キー「url」で示される URL。次の条件に基づいて、スラック チャネルでアラートを出す必要があります。

1) 10 分間のウィンドウで、100 件のリクエストがあり、リクエストの 5% 以上の応答時間が 100 ミリ秒を超えている場合、それらすべてのリクエストの「url」、「request_id」、および「response_time」を警告します。2) リクエストの 5 % 以下の応答時間が 100 ミリ秒を超える場合、アラートはまったく発生しません。このようなクエリを書きました。

_sourceName=<my_source_name> 
| json field=_raw "response_time" as response_time 
| json field=_raw "request_id" as request_id 
| if (num(response_time) > 100, 1, 0) as higher 
| if (num(response_time) <= 100, 1, 0) as lower 
| count as total_requests, sum(higher) as 
response_time_greater_than_100, sum(lower) as 
response_time_less_than_100 
| (response_time_greater_than_100/total_requests) as failure_ratio 
| where (failure_ratio > 0.05)

上記のクエリでは、5% 以上のリクエストで response_time が 100 ミリ秒を超えている場合に、すべてのリクエストが表示されます。しかし、応答時間に関係なく、すべてのリクエストを受け取ります。それ以外の場合、結果は返されません。

この結果に加えて、「response_time」> 100 ミリ秒のリクエストで上記のクエリをさらにフィルタリングしたいと考えています。結果があるたびに、2 つのタブが表示されます。1 つは「メッセージ」用で、もう 1 つは「集合体」用です。「メッセージ」タブのフィールドを Slack チャネルに送信したいと考えています。これを達成する方法は?

4

1 に答える 1

2

タブ - 集計とメッセージ

まず、これら 2 つのタブを明確にしましょう。最初のもの (メッセージ) には、結果を作成した元のログ行がすべて含まれています。2 つ目 (Aggregates) は、グループ化を使用した実際のクエリの結果です。グループ化演算子 ( SQL| countと同様) を使用していることに注意してください。GROUP BY

発信インタラクションは、常にクエリの実際の結果に基づいています (集計)。生の線は、検査のためにユーザー インターフェイスでのみ表示されます (API でも表示されます)。

実際のクエリ

応答時間が 100 を超えるすべてのリクエストを取得したいだけの場合は、次のようなクエリで十分です。

_sourceName=<my_source_name> 
| json field=_raw "response_time" as response_time 
| json field=_raw "request_id" as request_id 
| where response_time > 100

宣言的に言えば、あなたが何か違うことを望んでいることは理解しています。100 を超えるすべての応答を取得しますが、100 を超える要求が要求全体の 5% を超える場合にのみ取得し、それ以外の場合は空の結果セットを取得します。

_sourceName=<my_source_name> 
| 1 as expected_failure_ratio_violation
| where [subquery:
  _sourceName=<my_source_name> 
  | json field=_raw "response_time" as response_time 
  | json field=_raw "request_id" as request_id
  | if (num(response_time) > 100, 1, 0) as higher 
  | if (num(response_time) <= 100, 1, 0) as lower 
  | count as total_requests, sum(higher) as response_time_greater_than_100, 
    sum(lower) as response_time_less_than_100 
  | (response_time_greater_than_100/total_requests) as failure_ratio 
  | where (failure_ratio > 0.05)
  | count as expected_failure_ratio_violation 
  | compose expected_failure_ratio_violation        
]
| json field=_raw "response_time" as response_time 
| json field=_raw "request_id" as request_id
| where response_time > 100

1これは、サブクエリ ( ) 内の違反の数と一致する (定数) というトリックを使用しexpected_failure_ratio_violationます。

また、ヒントとして、| timesliceここでは使用していません。私の経験では、このようなシナリオで人々が通常使用するものです。あなたはそれを見てみたいかもしれません。

免責事項: 現在、Sumo Logic に勤務しています。

于 2019-06-04T11:05:18.733 に答える