Apache Beam 第三方 Java 擴充功能

這些是一些可能對特定應用程式有用的第三方 Java 程式庫。

剖析 HTTPD/NGINX 存取日誌。

摘要

Apache HTTPD 網頁伺服器會建立包含有關對網頁伺服器所執行要求的寶貴資訊的日誌檔。這些日誌檔的格式是 Apache HTTPD 伺服器中的設定選項,因此將其剖析為有用的資料元素通常很難做到。

為了解決這個問題,開發了一個與 Apache Beam 結合使用的程式庫,該程式庫能夠同時處理 Apache HTTPD 和 NGINX。

基本概念是,日誌格式規格是建立該行的結構描述。此剖析器只需使用此結構描述和您要提取的欄位列表進行初始化即可。

專案頁面

https://github.com/nielsbasjes/logparser

授權

Apache 授權 2.0

下載

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

程式碼範例

假設一個 WebEvent 類別具有 setters setIP、setQueryImg 和 setQueryStringValues

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()));
      }
    })
  );

分析 Useragent 字串

摘要

剖析並分析 useragent 字串,並提取盡可能多的相關屬性。

專案頁面

https://github.com/nielsbasjes/yauaa

授權

Apache 授權 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;
        }
    }));