55 "io/ioutil"
66 "os"
77 "runtime"
8+ "strings"
9+ "sync"
810 "time"
911
1012 "github.com/src-d/gitcollector"
@@ -27,7 +29,7 @@ type DownloadCmd struct {
2729 TmpPath string `long:"tmp" description:"directory to place generated temporal files" default:"/tmp" env:"GITCOLLECTOR_TMP"`
2830 Workers int `long:"workers" description:"number of workers, default to GOMAXPROCS" env:"GITCOLLECTOR_WORKERS"`
2931 NotAllowUpdates bool `long:"no-updates" description:"don't allow updates on already downloaded repositories" env:"GITCOLLECTOR_NO_UPDATES"`
30- Org string `long:"org " env:"GITHUB_ORGANIZATION " description:"github organization" required:"true"`
32+ Orgs string `long:"orgs " env:"GITHUB_ORGANIZATIONS " description:"list of github organization names separated by comma " required:"true"`
3133 Token string `long:"token" env:"GITHUB_TOKEN" description:"github token"`
3234 MetricsDBURI string `long:"metrics-db" env:"GITCOLLECTOR_METRICS_DB_URI" description:"uri to a database where metrics will be sent"`
3335 MetricsDBTable string `long:"metrics-db-table" env:"GITCOLLECTOR_METRICS_DB_TABLE" default:"gitcollector_metrics" description:"table name where the metrics will be added"`
@@ -36,6 +38,10 @@ type DownloadCmd struct {
3638
3739// Execute runs the command.
3840func (c * DownloadCmd ) Execute (args []string ) error {
41+ start := time .Now ()
42+
43+ orgs := strings .Split (c .Orgs , "," )
44+
3945 info , err := os .Stat (c .LibPath )
4046 check (err , "wrong path to locate the library" )
4147
@@ -73,7 +79,9 @@ func (c *DownloadCmd) Execute(args []string) error {
7379 authTokens := map [string ]string {}
7480 if c .Token != "" {
7581 log .Debugf ("acces token found" )
76- authTokens [c .Org ] = c .Token
82+ for _ , org := range orgs {
83+ authTokens [org ] = c .Token
84+ }
7785 }
7886
7987 workers := c .Workers
@@ -103,16 +111,12 @@ func (c *DownloadCmd) Execute(args []string) error {
103111
104112 var mc gitcollector.MetricsCollector
105113 if c .MetricsDBURI != "" {
106- db , err := metrics .PrepareDB (
107- c .MetricsDBURI , c .MetricsDBTable , c .Org ,
114+ mc = setupMetrics (
115+ c .MetricsDBURI ,
116+ c .MetricsDBTable ,
117+ orgs ,
118+ c .MetricsSync ,
108119 )
109- check (err , "metrics database" )
110-
111- mc = metrics .NewCollector (& metrics.CollectorOpts {
112- Log : log .New (nil ),
113- Send : metrics .SendToDB (db , c .MetricsDBTable , c .Org ),
114- SyncTime : time .Duration (c .MetricsSync ) * time .Second ,
115- })
116120
117121 log .Debugf ("metrics collection activated: sync timeout %d" ,
118122 c .MetricsSync )
@@ -125,23 +129,13 @@ func (c *DownloadCmd) Execute(args []string) error {
125129 wp .Run ()
126130 log .Debugf ("worker pool is running" )
127131
128- dp := discovery .NewGHProvider (
129- c .Org ,
130- download ,
131- & discovery.GHProviderOpts {
132- AuthToken : c .Token ,
133- },
134- )
132+ go runGHOrgProviders (log .New (nil ), orgs , c .Token , download )
135133
136- log .Debugf ("github provider started" )
137- if err := dp .Start (); err != nil &&
138- ! gitcollector .ErrProviderStopped .Is (err ) {
139- check (err , "github provider failed" )
140- }
141-
142- close (download )
143134 wp .Wait ()
144135 log .Debugf ("worker pool stopped successfully" )
136+
137+ elapsed := time .Since (start ).String ()
138+ log .Infof ("collection finished in %s" , elapsed )
145139 return nil
146140}
147141
@@ -151,3 +145,64 @@ func check(err error, message string) {
151145 os .Exit (1 )
152146 }
153147}
148+
149+ func setupMetrics (
150+ uri , table string ,
151+ orgs []string ,
152+ metricSync int64 ,
153+ ) gitcollector.MetricsCollector {
154+ db , err := metrics .PrepareDB (uri , table , orgs )
155+ check (err , "metrics database" )
156+
157+ mcs := make (map [string ]* metrics.Collector , len (orgs ))
158+ for _ , org := range orgs {
159+ mc := metrics .NewCollector (& metrics.CollectorOpts {
160+ Log : log .New (log.Fields {"org" : org }),
161+ Send : metrics .SendToDB (db , table , org ),
162+ SyncTime : time .Duration (metricSync ) * time .Second ,
163+ })
164+
165+ mcs [org ] = mc
166+ }
167+
168+ return metrics .NewCollectorByOrg (mcs )
169+ }
170+
171+ func runGHOrgProviders (
172+ logger log.Logger ,
173+ orgs []string ,
174+ token string ,
175+ download chan gitcollector.Job ,
176+ ) {
177+ var wg sync.WaitGroup
178+ wg .Add (len (orgs ))
179+ for _ , o := range orgs {
180+ org := o
181+ p := discovery .NewGHProvider (
182+ download ,
183+ discovery .NewGHOrgReposIter (
184+ org ,
185+ & discovery.GHReposIterOpts {
186+ AuthToken : token ,
187+ },
188+ ),
189+ & discovery.GHProviderOpts {},
190+ )
191+
192+ go func () {
193+ err := p .Start ()
194+ if err != nil &&
195+ ! discovery .ErrNewRepositoriesNotFound .Is (err ) {
196+ logger .Warningf (err .Error ())
197+ }
198+
199+ logger .Debugf ("%s organization provider stopped" , org )
200+ wg .Done ()
201+ }()
202+
203+ logger .Debugf ("%s organization provider started" , org )
204+ }
205+
206+ wg .Wait ()
207+ close (download )
208+ }
0 commit comments