Files
weave-scope/probe/cri/reporter.go
Lili Cosic e6d9bcc1cb Add CRI probe
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.
2018-07-26 10:51:59 +01:00

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
}