func CreateStats(statHistory map[enum.CacheName][]cache.Result, toData todata.TOData, crStates peer.Crstates, lastStats LastStats, now time.Time) (Stats, LastStats, error) { start := time.Now() dsStats := NewStats() for deliveryService, _ := range toData.DeliveryServiceServers { if deliveryService == "" { log.Errorf("EMPTY CreateStats deliveryService") continue } dsStats.DeliveryService[enum.DeliveryServiceName(deliveryService)] = *dsdata.NewStat() } dsStats = setStaticData(dsStats, toData.DeliveryServiceServers) var err error dsStats, err = addAvailableData(dsStats, crStates, toData.ServerCachegroups, toData.ServerDeliveryServices, toData.ServerTypes, statHistory) // TODO move after stat summarisation if err != nil { return dsStats, lastStats, fmt.Errorf("Error getting Cache availability data: %v", err) } for server, history := range statHistory { if len(history) < 1 { continue // TODO warn? } cachegroup, ok := toData.ServerCachegroups[server] if !ok { log.Warnf("server %s has no cachegroup, skipping\n", server) continue } serverType, ok := toData.ServerTypes[enum.CacheName(server)] if !ok { log.Warnf("server %s not in CRConfig, skipping\n", server) continue } result := history[len(history)-1] // TODO check result.PrecomputedData.Errors for ds, resultStat := range result.PrecomputedData.DeliveryServiceStats { if ds == "" { log.Errorf("EMPTY precomputed delivery service") continue } if _, ok := dsStats.DeliveryService[ds]; !ok { dsStats.DeliveryService[ds] = resultStat continue } httpDsStat := dsStats.DeliveryService[ds] httpDsStat.TotalStats = httpDsStat.TotalStats.Sum(resultStat.TotalStats) httpDsStat.CacheGroups[cachegroup] = httpDsStat.CacheGroups[cachegroup].Sum(resultStat.CacheGroups[cachegroup]) httpDsStat.Types[serverType] = httpDsStat.Types[serverType].Sum(resultStat.Types[serverType]) httpDsStat.Caches[server] = httpDsStat.Caches[server].Sum(resultStat.Caches[server]) httpDsStat.CachesTimeReceived[server] = resultStat.CachesTimeReceived[server] httpDsStat.CommonStats = dsStats.DeliveryService[ds].CommonStats dsStats.DeliveryService[ds] = httpDsStat // TODO determine if necessary } } perSecStats, lastStats := addPerSecStats(statHistory, dsStats, lastStats, now, toData.ServerCachegroups, toData.ServerTypes) log.Infof("CreateStats took %v\n", time.Since(start)) return perSecStats, lastStats, nil }
func processStatPluginRemapStats(server enum.CacheName, stats map[enum.DeliveryServiceName]dsdata.Stat, toData todata.TOData, stat string, statParts []string, value interface{}, timeReceived time.Time) (map[enum.DeliveryServiceName]dsdata.Stat, error) { if len(statParts) < 2 { return stats, fmt.Errorf("stat has no remap_stats deliveryservice and name parts") } fqdn := strings.Join(statParts[:len(statParts)-1], ".") ds, ok := toData.DeliveryServiceRegexes.DeliveryService(fqdn) if !ok { return stats, fmt.Errorf("ERROR no delivery service match for fqdn '%v' stat '%v'\n", fqdn, strings.Join(statParts, ".")) } if ds == "" { return stats, fmt.Errorf("ERROR EMPTY delivery service fqdn %v stat %v\n", fqdn, strings.Join(statParts, ".")) } statName := statParts[len(statParts)-1] dsStat, ok := stats[ds] if !ok { newStat := dsdata.NewStat() dsStat = *newStat } if err := addCacheStat(&dsStat.TotalStats, statName, value); err != nil { return stats, err } cachegroup, ok := toData.ServerCachegroups[server] if !ok { return stats, fmt.Errorf("server missing from TOData.ServerCachegroups") // TODO check logs, make sure this isn't normal } dsStat.CacheGroups[cachegroup] = dsStat.TotalStats cacheType, ok := toData.ServerTypes[server] if !ok { return stats, fmt.Errorf("server missing from TOData.ServerTypes") } dsStat.Types[cacheType] = dsStat.TotalStats dsStat.Caches[server] = dsStat.TotalStats dsStat.CachesTimeReceived[server] = timeReceived stats[ds] = dsStat return stats, nil }