mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-16 03:49:52 +00:00
When the probe.cri is enabled the CRI probe will be used to gather the container information via the CRI API. For now only the basic information is included in the generated report, those that we can get via the CRI ListContainersRequest.
74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package cri
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
client "github.com/weaveworks/scope/cri/runtime"
|
|
"github.com/weaveworks/scope/probe/docker"
|
|
"github.com/weaveworks/scope/report"
|
|
)
|
|
|
|
// Reporter generate Reports containing Container and ContainerImage topologies
|
|
type Reporter struct {
|
|
cri client.RuntimeServiceClient
|
|
}
|
|
|
|
// NewReporter makes a new Reporter
|
|
func NewReporter(cri client.RuntimeServiceClient) *Reporter {
|
|
reporter := &Reporter{
|
|
cri: cri,
|
|
}
|
|
|
|
return reporter
|
|
}
|
|
|
|
// Name of this reporter, for metrics gathering
|
|
func (Reporter) Name() string { return "CRI" }
|
|
|
|
// Report generates a Report containing Container topologies
|
|
func (r *Reporter) Report() (report.Report, error) {
|
|
result := report.MakeReport()
|
|
containerTopol, err := r.containerTopology()
|
|
if err != nil {
|
|
return report.MakeReport(), err
|
|
}
|
|
|
|
result.Container = result.Container.Merge(containerTopol)
|
|
return result, nil
|
|
}
|
|
|
|
func (r *Reporter) containerTopology() (report.Topology, error) {
|
|
result := report.MakeTopology().
|
|
WithMetadataTemplates(docker.ContainerImageMetadataTemplates).
|
|
WithTableTemplates(docker.ContainerImageTableTemplates)
|
|
|
|
ctx := context.Background()
|
|
resp, err := r.cri.ListContainers(ctx, &client.ListContainersRequest{})
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
|
|
for _, c := range resp.Containers {
|
|
result.AddNode(getNode(c))
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func getNode(c *client.Container) report.Node {
|
|
result := report.MakeNodeWith(report.MakeContainerNodeID(c.Id), map[string]string{
|
|
docker.ContainerName: c.Metadata.Name,
|
|
docker.ContainerID: c.Id,
|
|
docker.ContainerState: fmt.Sprintf("%v", c.State),
|
|
docker.ContainerRestartCount: fmt.Sprintf("%v", c.Metadata.Attempt),
|
|
docker.ImageID: c.ImageRef,
|
|
docker.ImageName: c.Image.Image,
|
|
}).WithParents(report.MakeSets().
|
|
Add(report.ContainerImage, report.MakeStringSet(report.MakeContainerImageNodeID(c.ImageRef))),
|
|
)
|
|
result = result.AddPrefixPropertyList(docker.LabelPrefix, c.Labels)
|
|
|
|
return result
|
|
}
|