如何通过动态切换集群名称执行远程Kusto查询?
问题描述
我的Prod和PPE环境拥有不同的ClusterUrl,希望编写一个可在两种环境中通用的查询。以下固定集群URL的查询可正常运行:
let clusterUrlPPE = 'myppekustocluster.westus2'; let databaseNamePPE = 'myppekustodatabase'; cluster(clusterUrlPPE).database(databaseNamePPE).SomefunctionName | count
但尝试通过变量动态切换集群URL和数据库名称时失败,报错信息如下:
let _environment= 'PPE'; let clusterUrlPPE = 'myppekustocluster.westus2'; let databaseNamePPE = 'myppekustodatabase'; let clusterUrlProd = 'myprodkustocluster.westus2'; let databaseNameProd = 'myprodkustodatabase'; let connectionStringFinal = iff(_environment =~ 'PPE', clusterUrlPPE, clusterUrlProd); let DatabaseNameFinal = iff(_environment =~ 'PPE', databaseNamePPE, databaseNameProd); cluster(connectionStringFinal).database(DatabaseNameFinal).SomefunctionName | count
cluster(): first argument must be a non-empty string literal
解决方案
Kusto的cluster()函数要求传入的参数必须是字符串字面量,不支持变量作为参数。要实现环境切换,需直接在iff中返回完整的cluster().database()调用分支,而非先赋值给变量再调用。
修改后的查询如下:
let _environment= 'PPE'; let clusterUrlPPE = 'myppekustocluster.westus2'; let databaseNamePPE = 'myppekustodatabase'; let clusterUrlProd = 'myprodkustocluster.westus2'; let databaseNameProd = 'myprodkustodatabase'; iff( _environment =~ 'PPE', cluster(clusterUrlPPE).database(databaseNamePPE).SomefunctionName, cluster(clusterUrlProd).database(databaseNameProd).SomefunctionName ) | count
这种写法能让Kusto在解析阶段识别到cluster()的参数是字符串字面量,同时通过iff实现根据环境变量切换不同数据源分支。
若需复用环境判断逻辑,可将分支逻辑封装成函数:
let getEnvironmentDataSource = (_environment: string) { iff( _environment =~ 'PPE', cluster('myppekustocluster.westus2').database('myppekustodatabase'), cluster('myprodkustocluster.westus2').database('myprodkustodatabase') ) }; getEnvironmentDataSource('PPE').SomefunctionName | count
内容的提问来源于stack exchange,提问作者Vinny
相关产品推荐
相关产品推荐

