Improve Docker image identifier parsing (#5838)
This commit is contained in:
parent
f76cca3af5
commit
633a468ff9
|
@ -346,6 +346,39 @@ func (d *Docker) gatherInfo(acc telegraf.Accumulator) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseImage(image string) (string, string) {
|
||||||
|
// Adapts some of the logic from the actual Docker library's image parsing
|
||||||
|
// routines:
|
||||||
|
// https://github.com/docker/distribution/blob/release/2.7/reference/normalize.go
|
||||||
|
domain := ""
|
||||||
|
remainder := ""
|
||||||
|
|
||||||
|
i := strings.IndexRune(image, '/')
|
||||||
|
|
||||||
|
if i == -1 || (!strings.ContainsAny(image[:i], ".:") && image[:i] != "localhost") {
|
||||||
|
remainder = image
|
||||||
|
} else {
|
||||||
|
domain, remainder = image[:i], image[i+1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
imageName := ""
|
||||||
|
imageVersion := "unknown"
|
||||||
|
|
||||||
|
i = strings.LastIndex(remainder, ":")
|
||||||
|
if i > -1 {
|
||||||
|
imageVersion = remainder[i+1:]
|
||||||
|
imageName = remainder[:i]
|
||||||
|
} else {
|
||||||
|
imageName = remainder
|
||||||
|
}
|
||||||
|
|
||||||
|
if domain != "" {
|
||||||
|
imageName = domain + "/" + imageName
|
||||||
|
}
|
||||||
|
|
||||||
|
return imageName, imageVersion
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Docker) gatherContainer(
|
func (d *Docker) gatherContainer(
|
||||||
container types.Container,
|
container types.Container,
|
||||||
acc telegraf.Accumulator,
|
acc telegraf.Accumulator,
|
||||||
|
@ -366,17 +399,7 @@ func (d *Docker) gatherContainer(
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// the image name sometimes has a version part, or a private repo
|
imageName, imageVersion := parseImage(container.Image)
|
||||||
// ie, rabbitmq:3-management or docker.someco.net:4443/rabbitmq:3-management
|
|
||||||
imageName := ""
|
|
||||||
imageVersion := "unknown"
|
|
||||||
i := strings.LastIndex(container.Image, ":") // index of last ':' character
|
|
||||||
if i > -1 {
|
|
||||||
imageVersion = container.Image[i+1:]
|
|
||||||
imageName = container.Image[:i]
|
|
||||||
} else {
|
|
||||||
imageName = container.Image
|
|
||||||
}
|
|
||||||
|
|
||||||
tags := map[string]string{
|
tags := map[string]string{
|
||||||
"engine_host": d.engine_host,
|
"engine_host": d.engine_host,
|
||||||
|
|
|
@ -815,3 +815,54 @@ func TestContainerName(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestParseImage(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
image string
|
||||||
|
parsedName string
|
||||||
|
parsedVersion string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
image: "postgres",
|
||||||
|
parsedName: "postgres",
|
||||||
|
parsedVersion: "unknown",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "postgres:latest",
|
||||||
|
parsedName: "postgres",
|
||||||
|
parsedVersion: "latest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "coreos/etcd",
|
||||||
|
parsedName: "coreos/etcd",
|
||||||
|
parsedVersion: "unknown",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "coreos/etcd:latest",
|
||||||
|
parsedName: "coreos/etcd",
|
||||||
|
parsedVersion: "latest",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "quay.io/postgres",
|
||||||
|
parsedName: "quay.io/postgres",
|
||||||
|
parsedVersion: "unknown",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "quay.io:4443/coreos/etcd",
|
||||||
|
parsedName: "quay.io:4443/coreos/etcd",
|
||||||
|
parsedVersion: "unknown",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
image: "quay.io:4443/coreos/etcd:latest",
|
||||||
|
parsedName: "quay.io:4443/coreos/etcd",
|
||||||
|
parsedVersion: "latest",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run("parse name "+tt.image, func(t *testing.T) {
|
||||||
|
imageName, imageVersion := parseImage(tt.image)
|
||||||
|
require.Equal(t, tt.parsedName, imageName)
|
||||||
|
require.Equal(t, tt.parsedVersion, imageVersion)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue