|
@@ -153,7 +153,11 @@ func (r *Registry) handleEvents(ch <-chan ebpftracer.Event) {
|
|
|
delete(r.containersByPid, pid)
|
|
delete(r.containersByPid, pid)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if ok := prometheus.WrapRegistererWith(prometheus.Labels{"container_id": string(id)}, r.reg).Unregister(c); !ok {
|
|
|
|
|
|
|
+ if ok := prometheus.WrapRegistererWith(setLabels(string(id),
|
|
|
|
|
+ c.K8sContainer.ns,
|
|
|
|
|
+ c.K8sContainer.podName,
|
|
|
|
|
+ c.K8sContainer.containerName,
|
|
|
|
|
+ c.K8sContainer.pid), r.reg).Unregister(c); !ok {
|
|
|
klog.Warningln("failed to unregister container:", id)
|
|
klog.Warningln("failed to unregister container:", id)
|
|
|
}
|
|
}
|
|
|
delete(r.containersById, id)
|
|
delete(r.containersById, id)
|
|
@@ -277,7 +281,8 @@ func (r *Registry) getOrCreateContainer(pid uint32) *Container {
|
|
|
klog.Warningf("failed to get container metadata for pid %d -> %s: %s", pid, cg.Id, err)
|
|
klog.Warningf("failed to get container metadata for pid %d -> %s: %s", pid, cg.Id, err)
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
- id := calcId(cg, md)
|
|
|
|
|
|
|
+ // add ns/workload/podname
|
|
|
|
|
+ id, extensionTag := calcId(cg, md)
|
|
|
klog.Infof("calculated container id %d -> %s -> %s", pid, cg.Id, id)
|
|
klog.Infof("calculated container id %d -> %s -> %s", pid, cg.Id, id)
|
|
|
if id == "" {
|
|
if id == "" {
|
|
|
if cg.Id == "/init.scope" && pid != 1 {
|
|
if cg.Id == "/init.scope" && pid != 1 {
|
|
@@ -299,6 +304,7 @@ func (r *Registry) getOrCreateContainer(pid uint32) *Container {
|
|
|
c.nsConntrack = nil
|
|
c.nsConntrack = nil
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ setK8sTag(c, extensionTag, pid)
|
|
|
r.containersByPid[pid] = c
|
|
r.containersByPid[pid] = c
|
|
|
r.containersByCgroupId[cg.Id] = c
|
|
r.containersByCgroupId[cg.Id] = c
|
|
|
return c
|
|
return c
|
|
@@ -310,7 +316,15 @@ func (r *Registry) getOrCreateContainer(pid uint32) *Container {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
klog.InfoS("detected a new container", "pid", pid, "cg", cg.Id, "id", id)
|
|
klog.InfoS("detected a new container", "pid", pid, "cg", cg.Id, "id", id)
|
|
|
- if err := prometheus.WrapRegistererWith(prometheus.Labels{"container_id": string(id)}, r.reg).Register(c); err != nil {
|
|
|
|
|
|
|
+ // add ns/workload/podname/pid/ctype
|
|
|
|
|
+ //sType := fmt.Sprintf("%d", cg.ContainerType)
|
|
|
|
|
+
|
|
|
|
|
+ setK8sTag(c, extensionTag, pid)
|
|
|
|
|
+ if err := prometheus.WrapRegistererWith(setLabels(string(id),
|
|
|
|
|
+ extensionTag[Namespace],
|
|
|
|
|
+ extensionTag[PodName],
|
|
|
|
|
+ extensionTag[ProcessName],
|
|
|
|
|
+ fmt.Sprintf("%d", pid)), r.reg).Register(c); err != nil {
|
|
|
klog.Warningln("failed to register container:", err)
|
|
klog.Warningln("failed to register container:", err)
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
@@ -320,20 +334,21 @@ func (r *Registry) getOrCreateContainer(pid uint32) *Container {
|
|
|
return c
|
|
return c
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func calcId(cg *cgroup.Cgroup, md *ContainerMetadata) ContainerID {
|
|
|
|
|
|
|
+func calcId(cg *cgroup.Cgroup, md *ContainerMetadata) (ContainerID, map[string]string) {
|
|
|
|
|
+ extensionTag := map[string]string{Namespace: "", Workload: "", PodName: "", ProcessName: ""}
|
|
|
if cg.ContainerType == cgroup.ContainerTypeSystemdService {
|
|
if cg.ContainerType == cgroup.ContainerTypeSystemdService {
|
|
|
if strings.HasPrefix(cg.ContainerId, "/system.slice/crio-conmon-") {
|
|
if strings.HasPrefix(cg.ContainerId, "/system.slice/crio-conmon-") {
|
|
|
- return ""
|
|
|
|
|
|
|
+ return "", extensionTag
|
|
|
}
|
|
}
|
|
|
- return ContainerID(cg.ContainerId)
|
|
|
|
|
|
|
+ return ContainerID(cg.ContainerId), extensionTag
|
|
|
}
|
|
}
|
|
|
switch cg.ContainerType {
|
|
switch cg.ContainerType {
|
|
|
case cgroup.ContainerTypeDocker, cgroup.ContainerTypeContainerd, cgroup.ContainerTypeSandbox, cgroup.ContainerTypeCrio:
|
|
case cgroup.ContainerTypeDocker, cgroup.ContainerTypeContainerd, cgroup.ContainerTypeSandbox, cgroup.ContainerTypeCrio:
|
|
|
default:
|
|
default:
|
|
|
- return ""
|
|
|
|
|
|
|
+ return "", extensionTag
|
|
|
}
|
|
}
|
|
|
if cg.ContainerId == "" {
|
|
if cg.ContainerId == "" {
|
|
|
- return ""
|
|
|
|
|
|
|
+ return "", extensionTag
|
|
|
}
|
|
}
|
|
|
if md.labels["io.kubernetes.pod.name"] != "" {
|
|
if md.labels["io.kubernetes.pod.name"] != "" {
|
|
|
pod := md.labels["io.kubernetes.pod.name"]
|
|
pod := md.labels["io.kubernetes.pod.name"]
|
|
@@ -343,9 +358,13 @@ func calcId(cg *cgroup.Cgroup, md *ContainerMetadata) ContainerID {
|
|
|
name = "sandbox"
|
|
name = "sandbox"
|
|
|
}
|
|
}
|
|
|
if name == "" || name == "POD" { // skip pause containers
|
|
if name == "" || name == "POD" { // skip pause containers
|
|
|
- return ""
|
|
|
|
|
|
|
+ return "", extensionTag
|
|
|
}
|
|
}
|
|
|
- return ContainerID(fmt.Sprintf("/k8s/%s/%s/%s", namespace, pod, name))
|
|
|
|
|
|
|
+ extensionTag[Namespace] = namespace
|
|
|
|
|
+ extensionTag[Workload] = ""
|
|
|
|
|
+ extensionTag[PodName] = pod
|
|
|
|
|
+ extensionTag[ProcessName] = name
|
|
|
|
|
+ return ContainerID(fmt.Sprintf("/k8s/%s/%s/%s", namespace, pod, name)), extensionTag
|
|
|
}
|
|
}
|
|
|
if taskNameParts := strings.SplitN(md.labels["com.docker.swarm.task.name"], ".", 3); len(taskNameParts) == 3 {
|
|
if taskNameParts := strings.SplitN(md.labels["com.docker.swarm.task.name"], ".", 3); len(taskNameParts) == 3 {
|
|
|
namespace := md.labels["com.docker.stack.namespace"]
|
|
namespace := md.labels["com.docker.stack.namespace"]
|
|
@@ -356,13 +375,13 @@ func calcId(cg *cgroup.Cgroup, md *ContainerMetadata) ContainerID {
|
|
|
if namespace == "" {
|
|
if namespace == "" {
|
|
|
namespace = "_"
|
|
namespace = "_"
|
|
|
}
|
|
}
|
|
|
- return ContainerID(fmt.Sprintf("/swarm/%s/%s/%s", namespace, service, taskNameParts[1]))
|
|
|
|
|
|
|
+ return ContainerID(fmt.Sprintf("/swarm/%s/%s/%s", namespace, service, taskNameParts[1])), extensionTag
|
|
|
}
|
|
}
|
|
|
if md.name == "" { // should be "pure" dockerd container here
|
|
if md.name == "" { // should be "pure" dockerd container here
|
|
|
klog.Warningln("empty dockerd container name for:", cg.ContainerId)
|
|
klog.Warningln("empty dockerd container name for:", cg.ContainerId)
|
|
|
- return ""
|
|
|
|
|
|
|
+ return "", extensionTag
|
|
|
}
|
|
}
|
|
|
- return ContainerID("/docker/" + md.name)
|
|
|
|
|
|
|
+ return ContainerID("/docker/" + md.name), extensionTag
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
func getContainerMetadata(cg *cgroup.Cgroup) (*ContainerMetadata, error) {
|
|
func getContainerMetadata(cg *cgroup.Cgroup) (*ContainerMetadata, error) {
|