github.com/netdata/go.d.plugin@v0.58.1/modules/dockerhub/collect.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package dockerhub
     4  
     5  import (
     6  	"fmt"
     7  	"time"
     8  )
     9  
    10  func (dh *DockerHub) collect() (map[string]int64, error) {
    11  	var (
    12  		reposNum = len(dh.Repositories)
    13  		ch       = make(chan *repository, reposNum)
    14  		mx       = make(map[string]int64)
    15  	)
    16  
    17  	for _, name := range dh.Repositories {
    18  		go dh.collectRepo(name, ch)
    19  	}
    20  
    21  	var (
    22  		parsed  int
    23  		pullSum int
    24  	)
    25  
    26  	for i := 0; i < reposNum; i++ {
    27  		repo := <-ch
    28  		if repo == nil {
    29  			continue
    30  		}
    31  		if err := parseRepoTo(repo, mx); err != nil {
    32  			dh.Errorf("error on parsing %s/%s : %v", repo.User, repo.Name, err)
    33  			continue
    34  		}
    35  		pullSum += repo.PullCount
    36  		parsed++
    37  	}
    38  	close(ch)
    39  
    40  	if parsed == reposNum {
    41  		mx["pull_sum"] = int64(pullSum)
    42  	}
    43  
    44  	return mx, nil
    45  }
    46  
    47  func (dh *DockerHub) collectRepo(repoName string, ch chan *repository) {
    48  	repo, err := dh.client.getRepository(repoName)
    49  	if err != nil {
    50  		dh.Error(err)
    51  	}
    52  	ch <- repo
    53  }
    54  
    55  func parseRepoTo(repo *repository, mx map[string]int64) error {
    56  	t, err := time.Parse(time.RFC3339Nano, repo.LastUpdated)
    57  	if err != nil {
    58  		return err
    59  	}
    60  	mx[fmt.Sprintf("last_updated_%s/%s", repo.User, repo.Name)] = int64(time.Since(t).Seconds())
    61  	mx[fmt.Sprintf("star_count_%s/%s", repo.User, repo.Name)] = int64(repo.StarCount)
    62  	mx[fmt.Sprintf("pull_count_%s/%s", repo.User, repo.Name)] = int64(repo.PullCount)
    63  	mx[fmt.Sprintf("status_%s/%s", repo.User, repo.Name)] = int64(repo.Status)
    64  	return nil
    65  }