高级过滤器不能表达ISNULL?
Advanced filter can't express ISNULL?
这两个过滤器 return 零个结果:
resource.labels:* AND resource.labels.namespace_name:*
resource.labels:* AND NOT resource.labels.namespace_name:*
虽然这个return很多:
resource.labels:*
关于这个我有三个问题:
- 这是怎么回事?
- 更重要的是,我如何排除特定值
namespace_name 而 不 排除未定义的记录
namespace_name ?
- 同样,如何为所有没有定义namespace_name的记录编写过滤器?
我从事 Stackdriver Logging 工作,并使用过处理查询的代码。
您是对的:存在运算符 (:*
) 出了点问题,它的工作方式与其他运算符不同。因此,否定存在运算符的行为不直观(或特别有用)。
我们认为这是一个错误,我真的很想修复它;但是,修复此 class 错误是一个漫长的过程,因此我提出了一些解决方法。
- 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:*
...遇到一个错误,其中字段存在检查 (:*
) 无法与否定正确交互。
- 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
类型,但通常不应首先发出这些标签。
- Similarly, how do I write a filter for all records that don't define namespace_name?
由于存在错误,您现在无法执行此操作。我认为最好的办法是识别所有使用 namespace_name
的 resource 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
日志通常应该有标签。
这两个过滤器 return 零个结果:
resource.labels:* AND resource.labels.namespace_name:*
resource.labels:* AND NOT resource.labels.namespace_name:*
虽然这个return很多:
resource.labels:*
关于这个我有三个问题:
- 这是怎么回事?
- 更重要的是,我如何排除特定值 namespace_name 而 不 排除未定义的记录 namespace_name ?
- 同样,如何为所有没有定义namespace_name的记录编写过滤器?
我从事 Stackdriver Logging 工作,并使用过处理查询的代码。
您是对的:存在运算符 (:*
) 出了点问题,它的工作方式与其他运算符不同。因此,否定存在运算符的行为不直观(或特别有用)。
我们认为这是一个错误,我真的很想修复它;但是,修复此 class 错误是一个漫长的过程,因此我提出了一些解决方法。
- 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:*
...遇到一个错误,其中字段存在检查 (:*
) 无法与否定正确交互。
- 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
类型,但通常不应首先发出这些标签。
- Similarly, how do I write a filter for all records that don't define namespace_name?
由于存在错误,您现在无法执行此操作。我认为最好的办法是识别所有使用 namespace_name
的 resource 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
日志通常应该有标签。