1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Use a regex to match labels

Signed-off-by: Robin THONI <robin@rthoni.com>
This commit is contained in:
Robin THONI 2019-01-16 21:52:22 +00:00
parent beef00cb26
commit bc709991b3
12 changed files with 39 additions and 11 deletions

View file

@ -189,6 +189,7 @@ func ValidateLogOpt(cfg map[string]string) error {
case "env": case "env":
case "env-regex": case "env-regex":
case "labels": case "labels":
case "labels-regex":
case "tag": case "tag":
case addressKey: case addressKey:
case bufferLimitKey: case bufferLimitKey:

View file

@ -20,6 +20,7 @@ const (
projectOptKey = "gcp-project" projectOptKey = "gcp-project"
logLabelsKey = "labels" logLabelsKey = "labels"
logLabelsRegexKey = "labels-regex"
logEnvKey = "env" logEnvKey = "env"
logEnvRegexKey = "env-regex" logEnvRegexKey = "env-regex"
logCmdKey = "gcp-log-cmd" logCmdKey = "gcp-log-cmd"
@ -210,7 +211,7 @@ func New(info logger.Info) (logger.Logger, error) {
func ValidateLogOpts(cfg map[string]string) error { func ValidateLogOpts(cfg map[string]string) error {
for k := range cfg { for k := range cfg {
switch k { switch k {
case projectOptKey, logLabelsKey, logEnvKey, logEnvRegexKey, logCmdKey, logZoneKey, logNameKey, logIDKey: case projectOptKey, logLabelsKey, logLabelsRegexKey, logEnvKey, logEnvRegexKey, logCmdKey, logZoneKey, logNameKey, logIDKey:
default: default:
return fmt.Errorf("%q is not a valid option for the gcplogs driver", k) return fmt.Errorf("%q is not a valid option for the gcplogs driver", k)
} }

View file

@ -207,6 +207,7 @@ func ValidateLogOpt(cfg map[string]string) error {
case "gelf-address": case "gelf-address":
case "tag": case "tag":
case "labels": case "labels":
case "labels-regex":
case "env": case "env":
case "env-regex": case "env-regex":
case "gelf-compression-level": case "gelf-compression-level":

View file

@ -98,6 +98,7 @@ func TestUDPValidateLogOpt(t *testing.T) {
"gelf-address": "udp://127.0.0.1:12201", "gelf-address": "udp://127.0.0.1:12201",
"tag": "testtag", "tag": "testtag",
"labels": "testlabel", "labels": "testlabel",
"labels-regex": "testlabel-regex",
"env": "testenv", "env": "testenv",
"env-regex": "testenv-regex", "env-regex": "testenv-regex",
"gelf-compression-level": "9", "gelf-compression-level": "9",

View file

@ -90,6 +90,7 @@ func validateLogOpt(cfg map[string]string) error {
for key := range cfg { for key := range cfg {
switch key { switch key {
case "labels": case "labels":
case "labels-regex":
case "env": case "env":
case "env-regex": case "env-regex":
case "tag": case "tag":

View file

@ -156,6 +156,7 @@ func ValidateLogOpt(cfg map[string]string) error {
case "max-size": case "max-size":
case "compress": case "compress":
case "labels": case "labels":
case "labels-regex":
case "env": case "env":
case "env-regex": case "env-regex":
case "tag": case "tag":

View file

@ -277,12 +277,12 @@ func TestJSONFileLoggerWithLabelsEnv(t *testing.T) {
} }
defer os.RemoveAll(tmp) defer os.RemoveAll(tmp)
filename := filepath.Join(tmp, "container.log") filename := filepath.Join(tmp, "container.log")
config := map[string]string{"labels": "rack,dc", "env": "environ,debug,ssl", "env-regex": "^dc"} config := map[string]string{"labels": "rack,dc", "labels-regex": "^loc", "env": "environ,debug,ssl", "env-regex": "^dc"}
l, err := New(logger.Info{ l, err := New(logger.Info{
ContainerID: cid, ContainerID: cid,
LogPath: filename, LogPath: filename,
Config: config, Config: config,
ContainerLabels: map[string]string{"rack": "101", "dc": "lhr"}, ContainerLabels: map[string]string{"rack": "101", "dc": "lhr", "location": "here"},
ContainerEnv: []string{"environ=production", "debug=false", "port=10001", "ssl=true", "dc_region=west"}, ContainerEnv: []string{"environ=production", "debug=false", "port=10001", "ssl=true", "dc_region=west"},
}) })
if err != nil { if err != nil {
@ -308,6 +308,7 @@ func TestJSONFileLoggerWithLabelsEnv(t *testing.T) {
expected := map[string]string{ expected := map[string]string{
"rack": "101", "rack": "101",
"dc": "lhr", "dc": "lhr",
"location": "here",
"environ": "production", "environ": "production",
"debug": "false", "debug": "false",
"ssl": "true", "ssl": "true",

View file

@ -100,6 +100,7 @@ func ValidateLogOpt(cfg map[string]string) error {
case "env": case "env":
case "env-regex": case "env-regex":
case "labels": case "labels":
case "labels-regex":
case "tag": case "tag":
case key: case key:
default: default:

View file

@ -41,6 +41,22 @@ func (info *Info) ExtraAttributes(keyMod func(string) string) (map[string]string
} }
} }
labelsRegex, ok := info.Config["labels-regex"]
if ok && len(labels) > 0 {
re, err := regexp.Compile(labelsRegex)
if err != nil {
return nil, err
}
for k, v := range info.ContainerLabels {
if re.MatchString(k) {
if keyMod != nil {
k = keyMod(k)
}
extra[k] = v
}
}
}
envMapping := make(map[string]string) envMapping := make(map[string]string)
for _, e := range info.ContainerEnv { for _, e := range info.ContainerEnv {
if kv := strings.SplitN(e, "=", 2); len(kv) == 2 { if kv := strings.SplitN(e, "=", 2); len(kv) == 2 {

View file

@ -44,6 +44,7 @@ const (
envKey = "env" envKey = "env"
envRegexKey = "env-regex" envRegexKey = "env-regex"
labelsKey = "labels" labelsKey = "labels"
labelsRegexKey = "labels-regex"
tagKey = "tag" tagKey = "tag"
) )
@ -565,6 +566,7 @@ func ValidateLogOpt(cfg map[string]string) error {
case envKey: case envKey:
case envRegexKey: case envRegexKey:
case labelsKey: case labelsKey:
case labelsRegexKey:
case tagKey: case tagKey:
default: default:
return fmt.Errorf("unknown log opt '%s' for %s log driver", key, driverName) return fmt.Errorf("unknown log opt '%s' for %s log driver", key, driverName)

View file

@ -189,6 +189,7 @@ func ValidateLogOpt(cfg map[string]string) error {
case "env": case "env":
case "env-regex": case "env-regex":
case "labels": case "labels":
case "labels-regex":
case "syslog-address": case "syslog-address":
case "syslog-facility": case "syslog-facility":
case "syslog-tls-ca-cert": case "syslog-tls-ca-cert":

View file

@ -137,6 +137,7 @@ func TestValidateLogOpt(t *testing.T) {
"env": "http://127.0.0.1", "env": "http://127.0.0.1",
"env-regex": "abc", "env-regex": "abc",
"labels": "labelA", "labels": "labelA",
"labels-regex": "def",
"syslog-address": "udp://1.2.3.4:1111", "syslog-address": "udp://1.2.3.4:1111",
"syslog-facility": "daemon", "syslog-facility": "daemon",
"syslog-tls-ca-cert": "/etc/ca-certificates/custom/ca.pem", "syslog-tls-ca-cert": "/etc/ca-certificates/custom/ca.pem",