高级过滤器无法表达ISNULL?

时间:2019-05-17 16:53:10

标签: stackdriver google-cloud-stackdriver

这两个过滤器返回零结果:

  • resource.labels:* AND resource.labels.namespace_name:*
  • resource.labels:* AND NOT resource.labels.namespace_name:*

虽然这返回了很多:

  • resource.labels:*

我对此有三个问题:

  1. 这是怎么回事?
  2. 更重要的是,如何排除特定的价值 namespace_name,而 not 排除未定义的记录 namespace_name吗?
  3. 类似地,我该如何为没有定义namespace_name的所有记录编写过滤器?

1 个答案:

答案 0 :(得分:2)

我从事Stackdriver Logging的工作,并处理了处理查询的代码。

您是正确的:状态操作符(:*)出现了问题,它的工作原理与其他操作符不同。结果,存在的否定运算符的行为不直观(或特别有用)。

我们认为这是一个错误,我真的很想修复它;但是,修复此类错误是一个漫长的过程,因此我提出了一些解决方法。

  
      
  1. 这是怎么回事?
  2.   

我无法复制您的第一个“零结果”过滤器:resource.labels:* AND resource.labels.namespace_name:*

这给了我一大堆包含namespace_name标签的日志。就其价值而言,resource.labels.namespace_name:*意味着resource.labels:*,因此实际上您只需要此过滤器的后半部分。

您的第二个“零结果”过滤器:resource.labels:* AND NOT resource.labels.namespace_name:*

...遇到一个错误,其中字段存在检查(:*)与否定不能正确交互。

  
      
  1. 更重要的是,如何排除特定的namespace_name值,而不排除没有定义namespace_name的记录?
  2.   

尽管日志API不需要,但GCP发出的资源通常会发出same sets of labels for a given resource type。您可以通过使用resource.type来将带有标签的资源与没有标签的资源隔离开,然后仅将标签约束应用于resource-with-label子句:

(resource.type != "k8s_container") OR
(resource.type = "k8s_container" AND resource.labels.namespace_name != "my-value")

在这里,我们依赖所有带有k8s_container标签的namespace_name型条目,通常应该如此。您可以修改它以选择多个Kubernetes前缀资源:

(NOT resource.type:"k8s_") OR
(resource.type:"k8s_" AND resource.labels.namespace_name != "my-value")

...或使用复杂的resource.type子句专门选择要从名称空间匹配中包含/排除的内容。

(NOT (resource.type = "k8s_container" OR resource.type = "k8s_pod")) OR
((resource.type = "k8s_container" OR resource.type = "k8s_pod") AND resource.labels.namespace_name != "my-value")

您不能查询没有k8s_container标签的namespace_name类型,但通常不应首先发出这些类型。

  
      
  1. 类似地,如何为所有未定义namespace_name的记录编写过滤器?
  2.   

由于该错误,您现在无法执行此操作。我认为您最好的选择是识别所有使用namespace_name的{​​{3}}并使用resource.type过滤器排除这些类型:

NOT (
  resource.type = "k8s_container" OR
  resource.type = "k8s_pod" OR
  resource.type = "knative_revision")

请注意,如前所述,尽管可能(API允许)具有k8s_container资源而没有namespace_name标签,却发出了k8s_container日志通常应带有标签。