New Relic Now+ 20以上の製品リリースなど、New Relicの今までで最も革新的なプラットフォームのアップデート
今すぐイベントをオンデマンドで見る

New Relicの課金体系としてインジェストサイズによって請求が行われます。そのため、インジェストサイズの見積もりや実績の詳細についてご確認されたいケースが多々あるかと思われます。本ブログでは、実際に多様なケースのLogをAPI経由でインジェストし、NrConsumptionに記録されるインジェストサイズをもとに調査した結果による推定される計算方法を記載させていただきます。なお、本ブログに記載された内容に関して、可能な限り、正確な内容に近いと考えてはおりますが、実際にテストした結果に基づく内容のため、実際のインジェストとは異なる可能性があることご了承ください。

インジェストサイズ計算の簡単な方法

NRQLの関数として、インジェスト量の推定ができるbytecountestimate()という関数があります。テストした全パターンにおいて、単一のLogに対してbytecountestimate()にて得られたインジェストサイズと、NrConsumptionに記録されたインジェストサイズは同一でした。

そのため、インジェストされたLogからインジェストサイズを知りたい場合、bytecountestimate()をご利用いただくのみで十分かと思われます。なお、ドキュメントに記載されていますが、24時間を超える範囲のデータは検出という制限があるので、クエリーの範囲が24時間未満で実施ください。

ログのインジェストサイズの詳細な計算

基本的には、NRDBに最終的に保存されているデータのサイズがインジェストサイズとして集計されるようです。また、サイズとして計算される対象は、属性名の両方のようです。実際の例を用いて以下に説明します。

例えば、Log APIを使って以下のようなLogを保存します。
 

{
    "message": "test log"
}

結果として、以下のようなデータがNRDBに保存されます。なお、送信時に含まれていない属性・値はNew RelicのPlatformにより自動で付与された属性・値になります。

{
    "message": "test log",
    "messageId": "ad75782b-40d6-44d7-a412-68588c2f8cd5",
    "newrelic.logPattern": "nr.DID_NOT_MATCH",
    "newrelic.logs.batchIndex": 1,
    "newrelic.source": "api.logs",
    "timestamp": 1745303560519
}

こちらのデータをbytecountestimate()で計算してみると、167 Byteでした。以下にその詳細な内訳を記載します。

属性名型(値)Byteサイズ(属性名)Byteサイズ(値)
messagetest logString78
messageIdad75782b-40d6-44d7-a412-68588c2f8cd5String936
newrelic.logPatternnr.DID_NOT_MATCHString1916
newrelic.logs.batchIndex1Number248
newrelic.sourceapi.logsString158
timestamp1745303560519Number98

NRDBに保存できるデータとして、文字列や数値にて保存されますが、それら型の違いによるバイト数は以下のようになっていると思われます。

バイト数
String1〜4バイト/文字
Number8バイト
Boolean1バイト

その他各ユースケースごとのインジェストサイズへの影響

パーシングルール

パーシングルールを使うと、対象の属性に格納されている値を抽出し別の属性に保存するなど構造化ができます。また、こちらのサイズに関して前述の通り最終的な保存サイズがインジェストサイズとなるようです。そのため、パーシングルールで抽出されたデータが保存された領域もインジェストサイズに含まれます。

4094文字を超えるログ

Logの各属性には最大で4094文字までしか保存できません。それを超えた文字は最大128 KByteまでblobとして保存されます。例えば、5,000文字messageという属性にて送った場合、newrelic.ext.messageという属性に、超えた文字数(906文字)が保存されます。インジェストサイズとしては、属性名のサイズ(message7 Bytenewrelic.ext.message20 Byte)と5,000文字のUTF-8でのバイト数がインジェストサイズとなるようです。

属性名変換

Logでは、一部属性が変換されて保存されます。例えば、logという属性はNRDBに保存される場合、messageという属性に保存されます。インジェストサイズはこの変換後の属性名のサイズにて計算されているようです。

マスク/難読化

機密データに対して、マスクあるいは難読化を実施するという機能があります。

マスクに関してはすべての文字列がXという文字に置き換えられます。インジェストサイズはこの置き換えられたあとの文字Xのバイト数が適用されるので、1文字1Byteとして記録されます。

難読化は、対象の文字列のハッシュがLogに記録されます。変換前の文字列のサイズに関わらず、64文字に英数字に変換されて保存されます。そのためハッシュ化された箇所は64 Byteになるようです。

まとめ

前述の通り、インジェストサイズは最終的にNRDBに保存されたサイズと同一となるようです。もし、机上の計算と異なっていた場合、バイト数計算方法の違い自動で追加される属性が影響している可能性が考えられます。こちらを参考にしていただくことでより、正確に確認していただけるかと思われますので、ご活用ください。