func (server *Server) serveOriginList(writer http.ResponseWriter, request *http.Request) { var offset, limit int if response, status := server.parseListRequest(writer, request, &offset, &limit); status != http.StatusOK { server.serveResponse(writer, response, status) return } originSet := set.New(set.ThreadSafe) for _, origin := range server.Catalog.Origins { if request.FormValue("filter") != "" && !utils.FilterMatch(request.FormValue("filter"), origin.Name) { continue } originSet.Add(origin.Name) } response := &listResponse{ list: StringListResponse(set.StringSlice(originSet)), offset: offset, limit: limit, } server.applyResponseLimit(writer, request, response) server.serveResponse(writer, response.list, http.StatusOK) }
func (server *Server) serveSource(writer http.ResponseWriter, request *http.Request) { sourceName := strings.TrimPrefix(request.URL.Path, urlCatalogPath+"sources/") if sourceName == "" { server.serveSourceList(writer, request) return } else if response, status := server.parseShowRequest(writer, request); status != http.StatusOK { server.serveResponse(writer, response, status) return } originSet := set.New(set.ThreadSafe) for _, origin := range server.Catalog.Origins { if _, ok := origin.Sources[sourceName]; ok { originSet.Add(origin.Name) } } if originSet.Size() == 0 { server.serveResponse(writer, serverResponse{mesgResourceNotFound}, http.StatusNotFound) return } origins := set.StringSlice(originSet) sort.Strings(origins) response := SourceResponse{ Name: sourceName, Origins: origins, } server.serveResponse(writer, response, http.StatusOK) }
func (server *Server) serveMetricList(writer http.ResponseWriter, request *http.Request) { var offset, limit int if response, status := server.parseListRequest(writer, request, &offset, &limit); status != http.StatusOK { server.serveResponse(writer, response, status) return } originName := request.FormValue("origin") sourceName := request.FormValue("source") sourceSet := set.New(set.ThreadSafe) if strings.HasPrefix(sourceName, library.LibraryGroupPrefix) { for _, entryName := range server.Library.ExpandGroup( strings.TrimPrefix(sourceName, library.LibraryGroupPrefix), library.LibraryItemSourceGroup, ) { sourceSet.Add(entryName) } } else if sourceName != "" { sourceSet.Add(sourceName) } metricSet := set.New(set.ThreadSafe) for _, origin := range server.Catalog.Origins { if originName != "" && origin.Name != originName { continue } for _, source := range origin.Sources { if sourceName != "" && sourceSet.IsEmpty() || !sourceSet.IsEmpty() && !sourceSet.Has(source.Name) { continue } for key := range source.Metrics { if request.FormValue("filter") != "" && !utils.FilterMatch(request.FormValue("filter"), key) { continue } metricSet.Add(key) } } } response := &listResponse{ list: StringListResponse(set.StringSlice(metricSet)), offset: offset, limit: limit, } server.applyResponseLimit(writer, request, response) server.serveResponse(writer, response.list, http.StatusOK) }
// ExpandGroup expands a group returning a list of matching items. func (library *Library) ExpandGroup(name string, groupType int) []string { item, err := library.GetItemByName(name, groupType) if err != nil { logger.Log(logger.LevelError, "library", "unknown item `%s': %s", name, err) return make([]string, 0) } group := item.(*Group) itemSet := set.New(set.ThreadSafe) for _, entry := range group.Entries { var re *regexp.Regexp if strings.HasPrefix(entry.Pattern, LibraryMatchPrefixRegexp) { re = regexp.MustCompile(strings.TrimPrefix(entry.Pattern, LibraryMatchPrefixRegexp)) } if _, ok := library.Catalog.Origins[entry.Origin]; !ok { logger.Log(logger.LevelError, "library", "unknown group entry `%s'", entry.Origin) continue } if groupType == LibraryItemSourceGroup { for _, source := range library.Catalog.Origins[entry.Origin].Sources { if strings.HasPrefix(entry.Pattern, LibraryMatchPrefixGlob) { if ok, _ := path.Match(strings.TrimPrefix(entry.Pattern, LibraryMatchPrefixGlob), source.Name); !ok { continue } } else if strings.HasPrefix(entry.Pattern, LibraryMatchPrefixRegexp) { if !re.MatchString(source.Name) { continue } } else if entry.Pattern != source.Name { continue } itemSet.Add(source.Name) } } else if groupType == LibraryItemMetricGroup { for _, source := range library.Catalog.Origins[entry.Origin].Sources { for _, metric := range source.Metrics { if strings.HasPrefix(entry.Pattern, LibraryMatchPrefixGlob) { if ok, _ := path.Match(strings.TrimPrefix(entry.Pattern, LibraryMatchPrefixGlob), metric.Name); !ok { continue } } else if strings.HasPrefix(entry.Pattern, LibraryMatchPrefixRegexp) { if !re.MatchString(metric.Name) { continue } } else if entry.Pattern != metric.Name { continue } itemSet.Add(metric.Name) } } } } result := set.StringSlice(itemSet) sort.Strings(result) return result }