Apache Beam サードパーティ Java 拡張機能

特定のアプリケーションで役立つ可能性のあるサードパーティ Java ライブラリをいくつか紹介します。

HTTPD/NGINX アクセスログの解析

まとめ

Apache HTTPD ウェブサーバーは、ウェブサーバーに対して行われたリクエストに関する貴重な情報を含むログファイルを作成します。これらのログファイルの形式は Apache HTTPD サーバーの構成オプションであるため、これを有用なデータ要素に解析することは通常非常に困難です。

この問題を簡単に解決するために、Apache Beam と組み合わせて動作し、Apache HTTPD と NGINX の両方でこれを実行できるライブラリが作成されました。

基本的な考え方は、ログ形式の仕様が、行の作成に使用されるスキーマであるということです。このパーサーは、このスキーマと抽出するフィールドのリストで初期化されます。

プロジェクトページ

https://github.com/nielsbasjes/logparser

ライセンス

Apache License 2.0

ダウンロード

<dependency>
  <groupId>nl.basjes.parse.httpdlog</groupId>
  <artifactId>httpdlog-parser</artifactId>
  <version>5.0</version>
</dependency>

コード例

セッター setIP、setQueryImg、setQueryStringValues を持つ WebEvent クラスを想定しています

PCollection<WebEvent> filledWebEvents = input
  .apply("Extract Elements from logline",
    ParDo.of(new DoFn<String, WebEvent>() {
      private Parser<WebEvent> parser;

      @Setup
      public void setup() throws NoSuchMethodException {
        parser = new HttpdLoglineParser<>(WebEvent.class,
            "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" \"%{Cookie}i\"");
        parser.addParseTarget("setIP",                  "IP:connection.client.host");
        parser.addParseTarget("setQueryImg",            "STRING:request.firstline.uri.query.img");
        parser.addParseTarget("setQueryStringValues",   "STRING:request.firstline.uri.query.*");
      }

      @ProcessElement
      public void processElement(ProcessContext c) throws InvalidDissectorException, MissingDissectorsException, DissectionFailure {
        c.output(parser.parse(c.element()));
      }
    })
  );

ユーザーエージェント文字列の分析

まとめ

ユーザーエージェント文字列を解析および分析し、関連する属性をできるだけ多く抽出します。

プロジェクトページ

https://github.com/nielsbasjes/yauaa

ライセンス

Apache License 2.0

ダウンロード

<dependency>
  <groupId>nl.basjes.parse.useragent</groupId>
  <artifactId>yauaa-beam</artifactId>
  <version>4.2</version>
</dependency>

コード例

PCollection<WebEvent> filledWebEvents = input
    .apply("Extract Elements from Useragent",
      ParDo.of(new UserAgentAnalysisDoFn<WebEvent>() {
        @Override
        public String getUserAgentString(WebEvent record) {
          return record.useragent;
        }

        @YauaaField("DeviceClass")
        public void setDC(WebEvent record, String value) {
          record.deviceClass = value;
        }

        @YauaaField("AgentNameVersion")
        public void setANV(WebEvent record, String value) {
          record.agentNameVersion = value;
        }
    }));