firehol/netdata

View on GitHub
src/go/plugin/go.d/modules/dockerhub/collect.go

Summary

Maintainability
A
0 mins
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package dockerhub

import (
    "fmt"
    "time"
)

func (dh *DockerHub) collect() (map[string]int64, error) {
    var (
        reposNum = len(dh.Repositories)
        ch       = make(chan *repository, reposNum)
        mx       = make(map[string]int64)
    )

    for _, name := range dh.Repositories {
        go dh.collectRepo(name, ch)
    }

    var (
        parsed  int
        pullSum int
    )

    for i := 0; i < reposNum; i++ {
        repo := <-ch
        if repo == nil {
            continue
        }
        if err := parseRepoTo(repo, mx); err != nil {
            dh.Errorf("error on parsing %s/%s : %v", repo.User, repo.Name, err)
            continue
        }
        pullSum += repo.PullCount
        parsed++
    }
    close(ch)

    if parsed == reposNum {
        mx["pull_sum"] = int64(pullSum)
    }

    return mx, nil
}

func (dh *DockerHub) collectRepo(repoName string, ch chan *repository) {
    repo, err := dh.client.getRepository(repoName)
    if err != nil {
        dh.Error(err)
    }
    ch <- repo
}

func parseRepoTo(repo *repository, mx map[string]int64) error {
    t, err := time.Parse(time.RFC3339Nano, repo.LastUpdated)
    if err != nil {
        return err
    }
    mx[fmt.Sprintf("last_updated_%s/%s", repo.User, repo.Name)] = int64(time.Since(t).Seconds())
    mx[fmt.Sprintf("star_count_%s/%s", repo.User, repo.Name)] = int64(repo.StarCount)
    mx[fmt.Sprintf("pull_count_%s/%s", repo.User, repo.Name)] = int64(repo.PullCount)
    mx[fmt.Sprintf("status_%s/%s", repo.User, repo.Name)] = int64(repo.Status)
    return nil
}