New Relicに送ったログに含まれるIPアドレスから位置情報を抽出してみる

## 概要
2023年3月のアップデートでNew Relicに送ったログに含まれているIPアドレスからGeo情報を抽出することが出来るようになりました。Geo情報がわかることで、どの国・地域からのアクセスが多いのかの傾向分析や、その傾向から不正アクセス元の把握などが出来るようになります。

便利な機能なので試してみます！！

:::note info
このアップデートの詳細はこちら。
[New Relic アップデート(2023年3月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202303)
[New Relic アップデート](https://newrelic.com/jp/blog/nerdlog/new-relic-update "New Relic アップデート")
:::

## 仕組みについて
システムがIPv4アドレスを含むログをNew Relicに送信した場合、IPv4アドレスからGeo情報を特定し、ログにGeo情報を含めることができるようになります。

例として次のログがあるとします。

```
2015-05-13T23:39:43.945958Z 146.190.212.184
```

New Relicではログデータの解析パターンを設定することで、構造化されてないログデータから属性（key:valueのペア）を抽出してくれます。

※ログデータの解析パターンの詳細は[公式ドキュメント](https://docs.newrelic.com/jp/docs/logs/ui-data/parsing/)をご確認ください。

今回は、IPv4アドレスがログに含まれていた場合、Geo情報を抽出するログデータの解析パターンを設定します。

```json
%{IP:ip:geo({"lookup":["city","region","countryCode", "latitude","longitude"]})}
```

New Relicのログデータの解析は[Grokパターン](https://docs.newrelic.com/jp/docs/logs/ui-data/parsing/#grok)を使用しており、**SYNTAX**の箇所に**IP**を定義することでIPアドレスをキーに解析を行う動きになっています。

```json
%{SYNTAX:SEMANTIC:geo({"lookup":["city","region","countryCode", "latitude","longitude"]})}
```

また、**SEMANTIC**の箇所に**ip**と設定することで、**ClientIP.lookup名**でkey名が設定されます。

New Relicの管理サイトで上記の解析パターンを設定することで、ログは次のように解釈されます。
```
ip: 146.190.212.184
ip.city: North Bergen
ip.countryCode: US
ip.countryName: United States
ip.latitude: 40.793
ip.longitude: -74.0247
ip.postalCode: 07047
ip.region: NJ
ip.regionName: New Jersey
containerTimestamp:2015-05-13T23:39:43.945958Z
ISO8601_TIMEZONE:Z
```

## 取得できるGeo情報について
IPv4アドレスからNew Relicが取得できるGeo情報は以下になります。

city: 都市名
countryCode: 国の略称
countryName: 国名
latitude: 緯度
longitude: 経度
postalCode: 郵便番号、郵便番号など
region: 州、州、または地域の略語
regionName: 州、県、または地域の名前

## 設定の流れ
NginxのアクセスログからGeo情報を抽出するのを試してみます。

ログデータの解析パターンを設定します。

New Relicの管理サイトにログインし、 「Logs」 -> 「Parsing」 -> 「Create parsing rule」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/7bbf499c-6668-c8dd-5b7c-3e0c69dc2ed0.png)

ログ解析ルールを設定していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/7fe92b9c-fef4-311a-8f49-6b1db8c4b127.png)
| 設定箇所 | 内容 | 設定例 |
| :--- | :--- | :--- |
| Name | 解析ルールの名前を入力 | GeoIP |
| Filed to parse | 解析するフィールド名を指定 | message |
| Filter logs based on NRQL | NRQL WHERE句でフィルタリングする設定値を入力 | `application` = 'nginx'<br>※Nginxのログだけ解析対象とするように設定 |

ログ解析ルールはNRQLで解析するログを検索しており、上記の設定を書くと以下のNRQLで解析対象のログを検索することになります。
```sql
FROM Log SELECT * WHERE `application` = 'nginx'
```

上記の設定にマッチしたログがNew Relicに取り込まれている場合、「Find matching log」に動的にリストアップされるので選択します。ログが取り込まれてない場合は「Paste log」にログを貼り付けることも可能です。ここで選択したログを使って、作成する解析ルールにマッチするか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/e3d8d7c0-736f-fbb1-586d-90be639d1b95.png)

それでは、解析ルールを作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/bd740748-1623-7074-b66c-b6b8365045b3.png)
```json
%{IP:ClientIP:geo({"lookup":["city","region","regionName","countryCode","countryName","postalCode","latitude","longitude"]})}
```
解析ルールにマッチして、Geo情報を取得できていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/78435a0c-d6b5-befe-0a43-422eeea56cda.png)

## NRQLで確認
抽出したGeo情報をNRQLで取り出してみます。
```sql
FROM
    Log
    SELECT
        count(*)
    WHERE
        application = 'nginx' FACET `ClientIP.countryName`
```
どの国からアクセスが多いのか確認することが出来ました。例えば、このチャートをダッシュボード化することで、リアルタイムにアクセス元の傾向把握ができるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3485441/e324f818-739a-c0bb-2903-f76b8edc9b47.png)

## まとめ
Nginxのアクセスログを例に、簡単にアクセス元IPv4アドレスからGeo情報を抽出できることを紹介させていただきました
簡単に設定できますので是非、ご活用ください！

:::note info
このアップデートの詳細はこちら。[New Relic アップデート(2023年3月)](https://newrelic.com/jp/blog/nerdlog/new-relic-update-202303)
:::
:::note info
無料のアカウントで試してみよう！
[New Relic フリープランで始めるオブザーバビリティ！](https://qiita.com/ktst79/items/5ee74b34e6adb8a7a6fa)
:::