func (c *Conf) loadLookup(s *parse.SectionNode) { name := s.Name.Text if _, ok := c.Lookups[name]; ok { c.errorf("duplicate lookup name: %s", name) } l := Lookup{ Name: name, } l.Text = s.RawText var lookupTags opentsdb.TagSet saw := make(map[string]bool) for _, n := range s.Nodes.Nodes { c.at(n) switch n := n.(type) { case *parse.SectionNode: if n.SectionType.Text != "entry" { c.errorf("unexpected subsection type") } tags, err := opentsdb.ParseTags(n.Name.Text) if tags == nil && err != nil { c.error(err) } if _, ok := saw[tags.String()]; ok { c.errorf("duplicate entry") } saw[tags.String()] = true if len(tags) == 0 { c.errorf("lookup entries require tags") } empty := make(opentsdb.TagSet) for k := range tags { empty[k] = "" } if len(lookupTags) == 0 { lookupTags = empty for k := range empty { l.Tags = append(l.Tags, k) } } else if !lookupTags.Equal(empty) { c.errorf("lookup tags mismatch, expected %v", lookupTags) } e := Entry{ Def: n.RawText, Name: n.Name.Text, ExprEntry: &ExprEntry{ AlertKey: models.NewAlertKey("", tags), Values: make(map[string]string), }, } for _, en := range n.Nodes.Nodes { c.at(en) switch en := en.(type) { case *parse.PairNode: e.Values[en.Key.Text] = en.Val.Text default: c.errorf("unexpected node") } } l.Entries = append(l.Entries, &e) default: c.errorf("unexpected node") } } c.at(s) c.Lookups[name] = &l }