高级过滤器不能表达ISNULL?

Advanced filter can't express ISNULL?

这两个过滤器 return 零个结果:

虽然这个return很多:

关于这个我有三个问题:

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

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

您是对的:存在运算符 (:*) 出了点问题,它的工作方式与其他运算符不同。因此,否定存在运算符的行为不直观(或特别有用)。

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

  1. What's going on here?

我无法重现您的第一个 "zero result" 过滤器:resource.labels:* AND resource.labels.namespace_name:*

这为我提供了包含 namespace_name 标签的大量日志列表。对于它的价值,resource.labels.namespace_name:* 意味着 resource.labels:*,因此您实际上只需要此过滤器的后半部分。

你的第二个 "zero result" 过滤器:resource.labels:* AND NOT resource.labels.namespace_name:*

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

  1. More importantly, how do I exclude a particular value of namespace_name while not excluding records that don't define namespace_name ?

虽然日志 API 不需要,但 GCP-emitted 资源通常会发出 same sets of labels for a given resource type。您可以通过使用 resource.type 将 resources-with-label 与 resources-without-label 隔离来利用这一点,然后仅将标签约束应用于 resources-with-label 子句:

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

在这里,我们依赖于所有具有 namespace_name 标签的 k8s_container 类型的条目,通常情况下应该如此。您可以将其修改为 select 多个 Kubernetes-prefixed 资源:

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

... 或使用复杂的 resource.type 子句来具体 select 您想要从命名空间匹配中 include/exclude 的

(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")

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

  1. Similarly, how do I write a filter for all records that don't define namespace_name?

由于存在错误,您现在无法执行此操作。我认为最好的办法是识别所有使用 namespace_nameresource types 并使用 resource.type 过滤器排除这些类型:

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

请注意,如前所述,虽然 可能 (API 允许)拥有 k8s_container 资源但没有 namespace_name 标签,发出 k8s_container 日志通常应该有标签。