这两个过滤器返回零结果:
resource.labels:* AND resource.labels.namespace_name:*
resource.labels:* AND NOT resource.labels.namespace_name:*
虽然这返回了很多:
resource.labels:*
我对此有三个问题:
答案 0 :(得分:2)
我从事Stackdriver Logging的工作,并处理了处理查询的代码。
您是正确的:状态操作符(:*
)出现了问题,它的工作原理与其他操作符不同。结果,存在的否定运算符的行为不直观(或特别有用)。
我们认为这是一个错误,我真的很想修复它;但是,修复此类错误是一个漫长的过程,因此我提出了一些解决方法。
- 这是怎么回事?
我无法复制您的第一个“零结果”过滤器:resource.labels:* AND resource.labels.namespace_name:*
这给了我一大堆包含namespace_name
标签的日志。就其价值而言,resource.labels.namespace_name:*
意味着resource.labels:*
,因此实际上您只需要此过滤器的后半部分。
您的第二个“零结果”过滤器:resource.labels:* AND NOT resource.labels.namespace_name:*
...遇到一个错误,其中字段存在检查(:*
)与否定不能正确交互。
- 更重要的是,如何排除特定的namespace_name值,而不排除没有定义namespace_name的记录?
尽管日志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
类型,但通常不应首先发出这些类型。
- 类似地,如何为所有未定义namespace_name的记录编写过滤器?
由于该错误,您现在无法执行此操作。我认为您最好的选择是识别所有使用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
日志通常应带有标签。