首页 > 解决方案 > 如何创建用户用户定义函数在 kusto 中进行字符串连接

问题描述

我需要使用数组创建一个我为此创建以下查询

let MyDistinct = (T:(table:dynamic)) {
  range x from 0 to array_length(table) step 1
    T | extend  strcat_array(details[0].parsedStack[x].method,'(',details[0].parsedStack[x].assembly,')')
};
let T1 = MyDistinct((exceptions | extend itemType =iif(itemType=='exception',itemType,"") | where itemType=='exception' and type == "System.Web.HttpException" | where timestamp >= ago(7d) | project callStack=details[0].parsedStack));
union
(T1),
(T2| project outerMessage,type,problemId,outerAssembly,itemType,operation_Name,operation_Id,operation_ParentId,client_Type,client_IP,cloud_RoleInstance,assembly)

我需要将 details[0].parsedStack[x] 值作为字符串放入以下格式 xxx_(xxx)"System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)"

我需要做的是

这是里面的值 - details[0].parsedStack 这来自数据库

调用栈

    [
{"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.DefaultControllerFactory.GetControllerInstance","level":0,"line":0},

{"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.DefaultControllerFactory.CreateController","level":1,"line":0},

{"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.ProcessRequestInit","level":2,"line":0},

{"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.BeginProcessRequest","level":3,"line":0},

{"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.BeginProcessRequest","level":4,"line":0},

{"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest","level":5,"line":0},

{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute","level":6,"line":0},{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+<>c__DisplayClass285_0.<ExecuteStepImpl>b__0","level":7,"line":0},

{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+StepInvoker.Invoke","level":8,"line":0},{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0","level":9,"line":0},

{"assembly":"Microsoft.AspNet.TelemetryCorrelation, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep","level":10,"line":0},

{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0","level":11,"line":0},

{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+StepInvoker.Invoke","level":12,"line":0},

{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication.ExecuteStepImpl","level":13,"line":0},

{"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication.ExecuteStep","level":14,"line":0}

]

我想将上面的 Jason 数组制作成以下格式

System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(System.Web.Mvc,版本=4.0.0.1,文化=中性,PublicKeyToken=31bf3856ad364e35)

xxxxx (x,x,x)

xxxxx (x,x,x)

System.Web.Mvc.DefaultControllerFactory.GetControllerInstance (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.Mvc.DefaultControllerFactory.CreateController (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.Mvc.MvcHandler.ProcessRequestInit (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.Mvc.MvcHandler.BeginProcessRequest (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest (System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 System.Web.HttpApplication+<>c__DisplayClass285_0.<ExecuteStepImpl>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 System.Web.HttpApplication+StepInvoker+<>c__DisplayClass4_0.<Invoke>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 Microsoft.AspNet.TelemetryCorrelation.TelemetryCorrelationHttpModule.OnExecuteRequestStep (Microsoft.AspNet.TelemetryCorrelation, Version=1.0.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35)
 System.Web.HttpApplication+<>c__DisplayClass284_0.<OnExecuteRequestStep>b__0 (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 System.Web.HttpApplication+StepInvoker.Invoke (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 System.Web.HttpApplication.ExecuteStepImpl (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)
 System.Web.HttpApplication.ExecuteStep (System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a)

注意 details[0].parsedStack[0] 是一本字典,但是我写的方式我有时会出错,请帮我解决这个问题

标签: azurekql

解决方案


您可以尝试以下方法:

datatable(d:dynamic)
[
    dynamic({"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.DefaultControllerFactory.GetControllerInstance","level":0,"line":0}),
    dynamic({"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.DefaultControllerFactory.CreateController","level":1,"line":0}),
    dynamic({"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.ProcessRequestInit","level":2,"line":0}),
    dynamic({"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.BeginProcessRequest","level":3,"line":0}),
    dynamic({"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.BeginProcessRequest","level":4,"line":0}),
    dynamic({"assembly":"System.Web.Mvc, Version=4.0.0.1, Culture=neutral, PublicKeyToken=31bf3856ad364e35","method":"System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest","level":5,"line":0}),
    dynamic({"assembly":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a","method":"System.Web.HttpApplication+CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute","level":6,"line":0})
]
| project result = strcat(d.method, "(", d.assembly, ")")

推荐阅读