New Relicの課金体系としてインジェストサイズによって請求が行われます。そのため、インジェストサイズの見積もりや実績の詳細についてご確認されたいケースが多々あるかと思われます。本ブログでは、実際に多様なケースのLogをAPI経由でインジェストし、NrConsumptionに記録されるインジェストサイズをもとに調査した結果による推定される計算方法を記載させていただきます。なお、本ブログに記載された内容に関して、可能な限り、正確な内容に近いと考えてはおりますが、実際にテストした結果に基づく内容のため、実際のインジェストとは異なる可能性があることご了承ください。
インジェストサイズ計算の簡単な方法
NRQLの関数として、インジェスト量の推定ができるbytecountestimate()という関数があります。テストした全パターンにおいて、単一のLogに対してbytecountestimate()
にて得られたインジェストサイズと、NrConsumptionに記録されたインジェストサイズは同一でした。
そのため、インジェストされたLogからインジェストサイズを知りたい場合、bytecountestimate()をご利用いただくのみで十分かと思われます。なお、ドキュメントに記載されていますが、24時間を超える範囲のデータは検出という制限があるので、クエリーの範囲が24時間未満で実施ください。
ログのインジェストサイズの詳細な計算
基本的には、NRDBに最終的に保存されているデータのサイズがインジェストサイズとして集計されるようです。また、サイズとして計算される対象は、属性名・値の両方のようです。実際の例を用いて以下に説明します。
例えば、Log APIを使って以下のようなLogを保存します。
結果として、以下のようなデータがNRDBに保存されます。なお、送信時に含まれていない属性・値はNew RelicのPlatformにより自動で付与された属性・値になります。
こちらのデータをbytecountestimate()
で計算してみると、167 Byteでした。以下にその詳細な内訳を記載します。
属性名 | 値 | 型(値) | Byteサイズ(属性名) | Byteサイズ(値) |
message | test log | String | 7 | 8 |
messageId | ad75782b-40d6-44d7-a412-68588c2f8cd5 | String | 9 | 36 |
newrelic.logPattern | nr.DID_NOT_MATCH | String | 19 | 16 |
newrelic.logs.batchIndex | 1 | Number | 24 | 8 |
newrelic.source | api.logs | String | 15 | 8 |
timestamp | 1745303560519 | Number | 9 | 8 |
NRDBに保存できるデータとして、文字列や数値にて保存されますが、それら型の違いによるバイト数は以下のようになっていると思われます。
型 | バイト数 |
String | 1〜4バイト/文字 |
Number | 8バイト |
Boolean | 1バイト |
その他各ユースケースごとのインジェストサイズへの影響
パーシングルール
パーシングルールを使うと、対象の属性に格納されている値を抽出し別の属性に保存するなど構造化ができます。また、こちらのサイズに関して前述の通り最終的な保存サイズがインジェストサイズとなるようです。そのため、パーシングルールで抽出されたデータが保存された領域もインジェストサイズに含まれます。
4094文字を超えるログ
Logの各属性には最大で4094文字までしか保存できません。それを超えた文字は最大128 KByteまでblobとして保存されます。例えば、5,000文字をmessage
という属性にて送った場合、newrelic.ext.message
という属性に、超えた文字数(906文字)が保存されます。インジェストサイズとしては、属性名のサイズ(message
:7 Byte、newrelic.ext.message
:20 Byte)と5,000文字のUTF-8でのバイト数がインジェストサイズとなるようです。
属性名変換
Logでは、一部属性が変換されて保存されます。例えば、log
という属性はNRDBに保存される場合、message
という属性に保存されます。インジェストサイズはこの変換後の属性名のサイズにて計算されているようです。
マスク/難読化
機密データに対して、マスクあるいは難読化を実施するという機能があります。
マスクに関してはすべての文字列がX
という文字に置き換えられます。インジェストサイズはこの置き換えられたあとの文字X
のバイト数が適用されるので、1文字1Byteとして記録されます。
難読化は、対象の文字列のハッシュがLogに記録されます。変換前の文字列のサイズに関わらず、64文字に英数字に変換されて保存されます。そのためハッシュ化された箇所は64 Byteになるようです。
まとめ
前述の通り、インジェストサイズは最終的にNRDBに保存されたサイズと同一となるようです。もし、机上の計算と異なっていた場合、バイト数計算方法の違いや自動で追加される属性が影響している可能性が考えられます。こちらを参考にしていただくことでより、正確に確認していただけるかと思われますので、ご活用ください。
本ブログに掲載されている見解は著者に所属するものであり、必ずしも New Relic 株式会社の公式見解であるわけではありません。また、本ブログには、外部サイトにアクセスするリンクが含まれる場合があります。それらリンク先の内容について、New Relic がいかなる保証も提供することはありません。