2017-11-25 15:36:03 +03:00
package collector
import (
"bytes"
"encoding/base64"
"encoding/json"
"net"
"net/http"
"strconv"
"time"
2018-03-01 10:10:04 +03:00
"github.com/containous/traefik/anonymize"
2018-11-27 19:42:04 +03:00
"github.com/containous/traefik/config/static"
2017-11-25 15:36:03 +03:00
"github.com/containous/traefik/log"
2018-11-14 12:18:03 +03:00
"github.com/containous/traefik/old/configuration"
2017-11-25 15:36:03 +03:00
"github.com/containous/traefik/version"
"github.com/mitchellh/hashstructure"
)
// collectorURL URL where the stats are send
const collectorURL = "https://collect.traefik.io/619df80498b60f985d766ce62f912b7c"
// Collected data
type data struct {
Version string
Codename string
BuildDate string
Configuration string
Hash string
}
// Collect anonymous data.
2018-11-27 19:42:04 +03:00
func Collect ( staticConfiguration * static . Configuration ) error {
anonConfig , err := anonymize . Do ( staticConfiguration , false )
2017-11-25 15:36:03 +03:00
if err != nil {
return err
}
log . Infof ( "Anonymous stats sent to %s: %s" , collectorURL , anonConfig )
2018-11-27 19:42:04 +03:00
hashConf , err := hashstructure . Hash ( staticConfiguration , nil )
2017-11-25 15:36:03 +03:00
if err != nil {
return err
}
data := & data {
Version : version . Version ,
Codename : version . Codename ,
BuildDate : version . BuildDate ,
Hash : strconv . FormatUint ( hashConf , 10 ) ,
Configuration : base64 . StdEncoding . EncodeToString ( [ ] byte ( anonConfig ) ) ,
}
buf := new ( bytes . Buffer )
err = json . NewEncoder ( buf ) . Encode ( data )
if err != nil {
return err
}
_ , err = makeHTTPClient ( ) . Post ( collectorURL , "application/json; charset=utf-8" , buf )
return err
}
func makeHTTPClient ( ) * http . Client {
dialer := & net . Dialer {
Timeout : configuration . DefaultDialTimeout ,
KeepAlive : 30 * time . Second ,
DualStack : true ,
}
transport := & http . Transport {
Proxy : http . ProxyFromEnvironment ,
DialContext : dialer . DialContext ,
IdleConnTimeout : 90 * time . Second ,
TLSHandshakeTimeout : 10 * time . Second ,
ExpectContinueTimeout : 1 * time . Second ,
}
return & http . Client { Transport : transport }
}