Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

意外と知らないLogServiceのはなし(概要からデモ、ログ可視化まで)

171 views

Published on

Alibaba Cloudの特徴的なサービスであるログ収集サービスLogServiceについて解説します。導入から、検索、可視化までおみせします。

Published in: Technology
  • Be the first to comment

  • Be the first to like this

意外と知らないLogServiceのはなし(概要からデモ、ログ可視化まで)

  1. 1. 意外と知らないLogServiceの話 1 SBクラウド株式会社 ソリューションアーキテクト 石井 正浩 (2018/12/20)
  2. 2. アジェンダ 1. プロダクト紹介 2. デモ  設定例(Apacheサーバのログ収集) 3. FunctionComputeとLogService 4. 気づいた課題 2
  3. 3. LogService紹介 3
  4. 4. LogService紹介 4 "ログらしい"データを扱う完全マネージドサービス "ログらしい"データ Logtail API SDK Shard ・ ・ ・ OSS Function Compute LogSearch PB Scale Log Analysis LogHub Realtime Log Ingestion LogHub Realtime Log Consumption LogShipper Ship to Storage Store Shard Alibaba 他プロダクト
  5. 5. Logtail 5 LogService専用のログ収集エージェント 特徴 ・アプリケーションコードの変更なしに導入が可能 ・異常発生時はローカルにキャッシュし、再試行 ・インストール後、AlibabaCloudコンソールから中央集権的に管理可能。 ・Windows, Linuxの両方に対応 マシングループ webserver apserver Agent Agent Agent Agent Apache アクセスログ収集 Application カスタムログ収集 Logtail構成 AlibabaCloud Webコンソール 管理
  6. 6. デモ: LogServiceの設定~可視化まで 6
  7. 7. Apacheサーバのログ収集 7 以下環境を構築 ECS Global IP: 47.74.52.171 Local IP: 172.16.255.113 デモ内容 1. LogStoreの設定 2. マシングループの設定 3. Logtail構成の設定 4. Logtail installの仕方 5. 検索・可視化 中国のFC 日本のFC 定期的にアクセス LogService Apache Logtail 本資料で記載する箇所
  8. 8. 1. LogStoreの作成 8
  9. 9. 2. マシングループの作成 9
  10. 10. 3. Logtail構成の作成 10
  11. 11. 4. Logtailのインストール 11 Logtailのインストールはスクリプトを実行するのみ。 $ wget http://logtail-release-ap-northeast-1.oss-ap-northeast-1-internal.aliyuncs.com/linux64/logtail.sh -O logtail.sh $ chmod 755 logtail.sh $ ./logtail.sh install ap-northeast-1 インストールガイドはこちら https://jp.alibabacloud.com/help/doc-detail/28982.htm
  12. 12. 5. Analysis有効化とIndexの作成 12 1. 有効化をクリック 2. Indexを設定 やらなくてもそれらしく動く が、正しく動かないので注 意
  13. 13. クエリのお作法 全件表示 6. 検索・可視化(0) 13 * 検索キーワード | SQL 特定フィールドで絞る (検索キーワードだけ指定 ) status = 200 さらに集計したい status = 200 | SQL
  14. 14. 6. 検索・可視化(1) 14 ステータスコードの集計 * | SELECT status, count(1) AS pv GROUP BY status
  15. 15. 15 6. 検索・可視化(2) 分単位PVの集計 * | SELECT date_trunc('minute' , __time__) AS t, count(1) AS pv GROUP BY t ORDER BY t desc
  16. 16. 16 6. 検索・可視化(3) 国単位PVの集計 * | SELECT ip_to_country(remote_addr) AS country, COUNT(1) GROUP BY country
  17. 17. 17 6. 検索・可視化(4) status code(200 or 4xx) * | SELECT date_trunc('minute' , __time__) AS t, SUM(CASE WHEN status =200 THEN 1 ELSE 0 END) AS success, SUM(CASE WHEN 500 > status AND status >=400 THEN 1 ELSE 0 END) AS error_4xx GROUP BY t ORDER BY t ASC
  18. 18. 18 6. 検索・可視化(5) status code = 200のPV数/minと前1時間を利用した移動平均 (たぶん) status: 200 | SELECT date_trunc('minute' , __time__) AS t, COUNT(*) AS success, AVG(COUNT(*)) OVER (ORDER BY date_trunc('minute' , __time__) ASC ROWS BETWEEN CURRENT ROW AND 60 FOLLOWING ) AS moving_avr GROUP BY t ORDER BY t ASC
  19. 19. 19 考察 SQL超大切
  20. 20. その他: FunctionComputeとLogService 20
  21. 21. 21 Function ComputeでのLog出力 コード例(抜粋) → flaskを使ってHTTPサーバを提供。環境変数から接続元 IPを取り出して出力している logger = logging.getLogger(); ip = request.environ['REMOTE_ADDR'] logger.info("REMOTE_ADDR: {}".format(ip)) 出力例(抜粋) あれ、なんか余計なの 出てる・・・ やりたいこと: HTTPトリガーを設定したときの接続元IP別のアクセス数がほしい messageフィールドの中にデバッグ情報 付きで出力される
  22. 22. 22 Let's 可視化(1) キーワードで絞り込む ここではFunction名とloggingで出力している「REMOTE_ADDR」というキーワード
  23. 23. 23 Let's 可視化(2) 正規表現でIPアドレスを抜き出す Let's SQL & RegExp クエリ例 REMOTE_ADDR | | select regexp_extract(message, '(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5] )') as ip, count(*) as access_count group by ip
  24. 24. 24 考察 ログ設計超大切
  25. 25. Appendix: WebサーバとFunctionComputeの用意 25
  26. 26. 26 はじめに(前提事項) P.7 記載の構成を作成する手順 (大枠)を記載します。 ただし、ECSの作成やFunctionCompute自体の作成は公式ドキュメントサイト (https://jp.alibabacloud.com/help)に記載があるため、ここでは特徴的な部分のみ記載します。
  27. 27. 27 1. Apacheサーバの用意 ここではUbuntuサーバにApacheサーバを用意しています。 他のOSでも同等の構成は実現可能です。 # apt update # apt upgrade # apt install apache2 また、グローバルアドレスが必須のため、セキュリティには十分配慮してください。
  28. 28. 28 2. Function Computeの用意 ここでは2つのリージョン(上海と東京)から1で用意したApacheサーバへのアクセスを想定。 # -*- coding: utf-8 -*- import logging import urllib.request import random def handler(event, context): n = random.randrange(10,100); for i in range (int(n/10)): for j in range(10): r = random.randrange(0, 10); m = [0,0,0,0,0,0,0,0,1,2] uri = ["/", "/hoge.html", "/fuga.html"]; try: src = urllib.request.urlopen('http://ECSのグローバルIP' + uri[m[r]]).read() except urllib.error.HTTPError as err: pass トリガー: 時間トリガー (間隔は適当で大丈夫 ですが、デモでは1分 間隔にしてあります) サンプルコード:ある程度ランダムで、 2割程度は404となるアクセスを生成

×