天天看點

Observability:使用 Elastic Stack 分析地理空間資料

更多文章檢視 獨家下載下傳 | 《Elasticsearch 八大經典應用》獨享大咖場景化應用的秘密>>> 在之前的文章 “Observability:使用 Elastic Stack 分析地理空間資料 (一)”

,我詳述了如何從 OpenSky Network API 接口把資料導入到 Elasticsearch,并對這些資料進行可視化分析。也許針對很對的情況這個已經很滿足了,因為它确實可以幫我們從很多實時資料中提取很多有用的東西。

在今天的文章中,我們将參考之前的文章

“如何使用 Elasticsearch ingest 節點來豐富日志和名額” 。我們可以利用 Elasticsearch ingest 節點來更加豐富我們的資料,并對這些資料做更進一步的的分析。
Observability:使用 Elastic Stack 分析地理空間資料

為了達到這個目的,我們必須首先了解在之前索引中的 icao 字段。這個字段的意思是:

ICAO 機場代碼或位置訓示器是由四個字母組成的代碼,用于指定世界各地的機場。 這些代碼由國際民用航空組織定義并釋出在國際民航組織7910号檔案:位置訓示器中,供空中交通管制和航空公司營運(例如飛行計劃)使用。

我們之前的每個文檔是這樣的:

{
  "velocity" : 0.0,
  "icao" : "ad0851",
  "true_track" : 264.38,
  "time_position" : 1591190152,
  "callsign" : "AAL2535",
  "origin_country" : "United States",
  "position_source" : "ADS-B",
  "spi" : false,
  "request_time" : 1591190160,
  "last_contact" : 1591190152,
  "@timestamp" : "2020-06-03T13:16:03.723Z",
  "on_ground" : true,
  "location" : "32.7334,-117.2035"
}           

另外,我們可以在位址

https://opensky-network.org/datasets/metadata/

找到一個如下檔案:

Observability:使用 Elastic Stack 分析地理空間資料

在這裡,我們可以找到一個叫做 aircraftDatabase.csv 的檔案。它裡面的内容如下:

Observability:使用 Elastic Stack 分析地理空間資料

在上面的表格中,我們發現有一個叫做 icao24 的字段。這個字段和我們之前的文檔可以進行關聯,進而我們可以得到更多關于某個航班的更多資訊。

建立 enrich index

由于下載下傳的文檔時一個是一個 csv 的檔案。我們可以使用 data visualizer 來導入。

Observability:使用 Elastic Stack 分析地理空間資料
Observability:使用 Elastic Stack 分析地理空間資料

點選上面的 Override settings 連結:

Observability:使用 Elastic Stack 分析地理空間資料

點選 Apply 按鈕:

Observability:使用 Elastic Stack 分析地理空間資料

點選上面的 Import 按鈕:

Observability:使用 Elastic Stack 分析地理空間資料

我們把這個索引的名字稱作為 aircraft。點選 Advaned:

Observability:使用 Elastic Stack 分析地理空間資料

再次确認 mapping,如果沒有問題的話,點選 Import 按鈕:

Observability:使用 Elastic Stack 分析地理空間資料

由于這個檔案比較大,是以需要一點時間來進行導入:

Observability:使用 Elastic Stack 分析地理空間資料

等完成後,我們可以在 Elasticsearch 中找到一個叫做 aircraft 的索引:

Observability:使用 Elastic Stack 分析地理空間資料

上面顯示有一個新的 aircraft 的索引生成了。

建立 Enrich policy

接下來,我們來建立 enrich policy。它告訴我們如何豐富資料。在 Kibana 中打入如下的指令:

PUT /_enrich/policy/flights_policy
{
  "match": {
    "enrich_fields": [
      "acars",
      "adsb",
      "built",
      "category_description",
      "engines",
      "first_flight_date",
      "icao_aircraft_type",
      "line_number",
      "manufacturer_icao",
      "manufacturer_name",
      "model",
      "modes",
      "notes",
      "operator",
      "operator_callsign",
      "operator_iata",
      "operator_icao",
      "owner",
      "reg_until",
      "registered",
      "registration",
      "seat_configuration",
      "serial_number",
      "status",
      "test_reg",
      "type_code"
    ],
    "indices": [
      "aircraft"
    ],
    "match_field": "icao"
  }
}           

我們使用 execute enrich policy API 為該政策建立enrich索引:

POST /_enrich/policy/flights_policy/_execute
           

接着,我們建立一個叫做 flights_aircraft_enrichment 的 pipeline:

PUT /_ingest/pipeline/flights_aircraft_enrichment
{
  "description": "joins incoming ADSB state info with richer aircraft metadata",
  "processors": [
    {
      "enrich": {
        "field": "icao",
        "policy_name": "flights_policy",
        "target_field": "aircraft"
      }
    }
  ]
}           

到此為止,我們已經成功地建立了 豐富政策。接下來,我們将展示如何使用這個 pipeline 來豐富我們的資料。

豐富資料

為了能夠使用我們上面定義好的 pipeline,我們重參考之前的文章 “Observability:使用 Elastic Stack 分析地理空間資料 (一)”裡的 fligths_logstash.conf 檔案,并修改如下的 output 部分:

output {
    stdout { 
        codec => rubydebug
    }
 
    elasticsearch {
        manage_template => "false"
        index => "flights"
        # pipeline => "flights_aircraft_enrichment"
         hosts => "localhost:9200"
    }
}           

我們把上面的這一行的注釋拿掉:

# pipeline => "flights_aircraft_enrichment"
           

這樣變成了:

output {
    stdout { 
        codec => rubydebug
    }
 
    elasticsearch {
        manage_template => "false"
        index => "flights"
        pipeline => "flights_aircraft_enrichment"
         hosts => "localhost:9200"
    }
}           

在啟動 Logstash 之前,我們可以先删除之前的 flights 索引:

DELETE flights
           

再接着執行如下的指令:

PUT flights
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "baro_altitude": {
        "type": "float"
      },
      "callsign": {
        "type": "keyword"
      },
      "geo_altitude": {
        "type": "float"
      },
      "icao": {
        "type": "keyword"
      },
      "last_contact": {
        "type": "long"
      },
      "location": {
        "type": "geo_point"
      },
      "on_ground": {
        "type": "boolean"
      },
      "origin_country": {
        "type": "keyword"
      },
      "position_source": {
        "type": "keyword"
      },
      "request_time": {
        "type": "long"
      },
      "spi": {
        "type": "boolean"
      },
      "squawk": {
        "type": "long"
      },
      "time_position": {
        "type": "long"
      },
      "true_track": {
        "type": "float"
      },
      "velocity": {
        "type": "float"
      },
      "vertical_rate": {
        "type": "float"
      }
    }
  }
}
           

重新運作 Logstash:

sudo ./bin/logstash -f fligths_logstash.conf
           

我們在 Kibana 中檢查 flights 的 mapping:

GET flights/_mapping
           

我們可以看到一些新增加的各個新字段:

Observability:使用 Elastic Stack 分析地理空間資料

我們可以通過 search:

"_source" : {
          "aircraft" : {
            "owner" : "Wells Fargo Trust Co Na Trustee",
            "reg_until" : "2021-04-30",
            "modes" : false,
            "built" : "1984-01-01",
            "acars" : false,
            "manufacturer_icao" : "BOEING",
            "serial_number" : "23018",
            "manufacturer_name" : "Boeing",
            "icao_aircraft_type" : "L2J",
            "operator_callsign" : "GIANT",
            "operator_icao" : "GTI",
            "engines" : "GE CF6-80 SERIES",
            "icao" : "a8a763",
            "registration" : "N657GT",
            "model" : "767-281",
            "type_code" : "B762",
            "adsb" : false
          },
          "true_track" : 272.81,
          "velocity" : 5.14,
          "spi" : false,
          "origin_country" : "United States",
          "@timestamp" : "2020-06-04T10:41:00.558Z",
          "request_time" : 1591267250,
          "time_position" : 1591267168,
          "last_contact" : 1591267168,
          "callsign" : "GTI165",
          "icao" : "a8a763",
          "location" : "39.0446,-84.6505",
          "on_ground" : true,
          "position_source" : "ADS-B"
        }
      }
           

我們可看到一個叫做 aircraft 的字段,它含有這個飛機所有被豐富的資訊。

運用 Kibana 分析資料

找出前10的飛機型号

因為有新的字段進來,是以我們必須重新建立新的 inde pattern:

Observability:使用 Elastic Stack 分析地理空間資料

我們可以看到最多的是 PC-12/47E 這個機型。

找出飛機制造商的分布

Observability:使用 Elastic Stack 分析地理空間資料

我們看到 BOING 公司的市場佔有率是最大的。AIRBUS 處于第二的位置。

飛機機齡分布

Observability:使用 Elastic Stack 分析地理空間資料

我們可以看出來最多的飛機是2019年生産的。

飛機機型和飛行高度的關系

Observability:使用 Elastic Stack 分析地理空間資料

可以看出來 A320-214 飛機飛的是最高的。

Graph

運用 Graph 來找出資料直接的關系。如果你對 Graph 還不是很了解的話,請參閱我之前的教程 “Elastic Graph 介紹”。

Observability:使用 Elastic Stack 分析地理空間資料

點選 Create graph:

Observability:使用 Elastic Stack 分析地理空間資料

點選 Select a data source:

Observability:使用 Elastic Stack 分析地理空間資料

選擇 flights* :

Observability:使用 Elastic Stack 分析地理空間資料

點選 Add fields:

Observability:使用 Elastic Stack 分析地理空間資料

添加 fields:

Observability:使用 Elastic Stack 分析地理空間資料

我們需要保持這個 graph。然後進行搜尋:

Observability:使用 Elastic Stack 分析地理空間資料

從上面,我們可看出來 BOING 和我們想要的各個字段之間的關系。

我們從收集的資料可以有更多的其它的分析。在這裡,我就不一一枚舉了。你們可以做任何你想要的分析。

繼續閱讀