【发布时间】:2023-01-27 06:20:47
【问题描述】:
我有一个中间件遥测处理程序,它有一个等待请求执行的方法,然后尝试将响应主体中的一些关键数据值存储到应用程序洞察中的自定义维度字段中,因此我可以使用 graphana 和可能的其他第 3 方产品来分析我的反应。
public class ResponseBodyHandler : IResponseBodyHandler
{
private readonly ITelemetryPropertyHandler _telemetryPropertyHandler = new TelemetryPropertyHandler();
public void TransformResponseBodyDataToTelemetryData(RequestTelemetry requestTelemetry, string responseBody)
{
SuccessResponse<List<Booking>> result = null;
try
{
result = JsonConvert.DeserializeObject<SuccessResponse<List<Booking>>>(responseBody);
}
catch (Exception e)
{
Log.Error("Telemetry response handler, failure to deserialize response body: " + e.Message);
return;
}
_telemetryPropertyHandler.CreateTelemetryProperties(requestTelemetry, result);
}
}
public class TelemetryPropertyHandler : ITelemetryPropertyHandler
{
private readonly ILabelHandler _labelHandler = new LabelHandler();
public void CreateTelemetryProperties(RequestTelemetry requestTelemetry, SuccessResponse<List<Booking>> result)
{
Header bookingHeader = result?.SuccessObject?.FirstOrDefault()?.BookingHeader;
requestTelemetry?.Properties.Add("ResponseClientId", "" + bookingHeader?.ConsigneeNumber);
Line line = bookingHeader?.Lines.FirstOrDefault();
requestTelemetry?.Properties.Add("ResponseProductId", "" + line?.PurchaseProductID);
requestTelemetry?.Properties.Add("ResponseCarrierId", "" + line?.SubCarrierID);
_labelHandler.HandleLabel(requestTelemetry, bookingHeader);
requestTelemetry?.Properties.Add("ResponseBody", JsonConvert.SerializeObject(result));
}
}
现在,里面: _labelHandler.HandleLabel(requestTelemetry, bookingHeader); 它提取一个 base64 编码的图像,将字符串分成 8192 个字符的大小,并将它们添加到属性中:图像索引 0 .. N(N 是总块)
我可以调试并验证代码是否有效。 但是,在应用程序洞察力上,整个自定义维度字段都消失了。它很明显不见了。 我假设这是由于最大大小限制造成的,并且我可能会尝试添加比“允许”更多的数据,但是,我一辈子都找不到强制执行此限制的文档。
有人能告诉我我违反了什么规则吗?所以我可以截断图像,如果不可能存储那么多数据?或者如果我做错了什么?
我已经验证,我的代码工作正常,只要我将数据截断为单个属性,当然只部分存储图像。 (使所说的“功能”无用)
public class LabelHandler : ILabelHandler
{
private readonly IBase64Splitter _base64Splitter = new Base64Splitter();
public void HandleLabel(RequestTelemetry requestTelemetry, Header bookingHeader)
{
Label label = bookingHeader?.Labels.FirstOrDefault();
IEnumerable<List<char>> splitBase64String = _base64Splitter.SplitList(label?.Base64.ToList());
if (splitBase64String != null)
{
bool imageHandlingWorked = true;
try
{
int index = 0;
foreach (List<char> chunkOfImageString in splitBase64String)
{
string dictionaryKey = $"Image index {index}";
string chunkData = new string(chunkOfImageString.ToArray());
requestTelemetry?.Properties.Add(dictionaryKey, chunkData);
index++;
}
}
catch (Exception e)
{
imageHandlingWorked = false;
Log.Error("Error trying to store label in chunks: " + e.Message);
}
if (imageHandlingWorked && label != null)
{
label.Base64 = "";
}
}
}
}
上面的代码负责将块添加到 requestTelemetry 属性字段
public class Base64Splitter : IBase64Splitter
{
private const int ChunkSize = 8192;
public IEnumerable<List<T>> SplitList<T>(List<T> originalList)
{
for (var i = 0; i < originalList.Count; i += ChunkSize)
yield return originalList.GetRange(i, Math.Min(ChunkSize, originalList.Count - i));
}
}
这是创建字符列表块的特定方法,对应于 application insights maximum size pr custom dimension 字段。
这是被添加的截断字段的图像,如果我只是将自己限制为单个属性,但截断 base64 编码值。
【问题讨论】:
标签: c# azure-application-insights