func main() { // Parse arguments kingpin.Version(Version) kingpin.CommandLine.Help = "Search for logs in a Logstash Elasticsearch index." kingpin.Parse() errorLog = log.New(os.Stderr, "ERROR ", log.Ltime|log.Lshortfile) if *verboseFlag || *debugFlag { infoLog = log.New(os.Stderr, "INFO ", log.Ltime|log.Lshortfile) } if *debugFlag { debugLog = log.New(os.Stderr, "TRACE ", log.Ltime|log.Lshortfile) } // Connect to the Elasticsearch cluster logInfo("Creating client...\n") client, err := elastic.NewClient( elastic.SetURL((*urlFlag).String()), elastic.SetSniff(false), elastic.SetHealthcheck(false), elastic.SetErrorLog(errorLog), elastic.SetInfoLog(infoLog), elastic.SetTraceLog(debugLog)) exitIfErr(err) if *tailFlag { Tail(client) } else { Search(client) } }
func TestCreateElasticSearchConfig(t *testing.T) { url, err := url.Parse("?nodes=https://foo.com:20468&nodes=https://bar.com:20468&esUserName=test&esUserSecret=password&maxRetries=10&startupHealthcheckTimeout=30&sniff=false&healthCheck=false") if err != nil { t.Fatalf("Error when parsing URL: %s", err.Error()) } config, err := CreateElasticSearchConfig(url) if err != nil { t.Fatalf("Error when creating config: %s", err.Error()) } expectedClient, err := elastic.NewClient( elastic.SetURL("https://foo.com:20468", "https://bar.com:20468"), elastic.SetBasicAuth("test", "password"), elastic.SetMaxRetries(10), elastic.SetHealthcheckTimeoutStartup(30*time.Second), elastic.SetSniff(false), elastic.SetHealthcheck(false)) if err != nil { t.Fatalf("Error when creating client: %s", err.Error()) } actualClientRefl := reflect.ValueOf(config.EsClient).Elem() expectedClientRefl := reflect.ValueOf(expectedClient).Elem() if actualClientRefl.FieldByName("basicAuthUsername").String() != expectedClientRefl.FieldByName("basicAuthUsername").String() { t.Fatalf("basicAuthUsername is not equal") } if actualClientRefl.FieldByName("basicAuthUsername").String() != expectedClientRefl.FieldByName("basicAuthUsername").String() { t.Fatalf("basicAuthUsername is not equal") } if actualClientRefl.FieldByName("maxRetries").Int() != expectedClientRefl.FieldByName("maxRetries").Int() { t.Fatalf("maxRetries is not equal") } if actualClientRefl.FieldByName("healthcheckTimeoutStartup").Int() != expectedClientRefl.FieldByName("healthcheckTimeoutStartup").Int() { t.Fatalf("healthcheckTimeoutStartup is not equal") } if actualClientRefl.FieldByName("snifferEnabled").Bool() != expectedClientRefl.FieldByName("snifferEnabled").Bool() { t.Fatalf("snifferEnabled is not equal") } if actualClientRefl.FieldByName("healthcheckEnabled").Bool() != expectedClientRefl.FieldByName("healthcheckEnabled").Bool() { t.Fatalf("healthcheckEnabled is not equal") } }
func (t *TestCase) setup() error { var errorlogger *log.Logger if t.errorlogfile != "" { f, err := os.OpenFile(t.errorlogfile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664) if err != nil { return err } errorlogger = log.New(f, "", log.Ltime|log.Lmicroseconds|log.Lshortfile) } var infologger *log.Logger if t.infologfile != "" { f, err := os.OpenFile(t.infologfile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664) if err != nil { return err } infologger = log.New(f, "", log.LstdFlags) } // Trace request and response details like this var tracelogger *log.Logger if t.tracelogfile != "" { f, err := os.OpenFile(t.tracelogfile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0664) if err != nil { return err } tracelogger = log.New(f, "", log.LstdFlags) } client, err := elastic.NewClient( elastic.SetURL(t.nodes...), elastic.SetErrorLog(errorlogger), elastic.SetInfoLog(infologger), elastic.SetTraceLog(tracelogger), elastic.SetMaxRetries(t.maxRetries), elastic.SetSniff(t.sniff), elastic.SetSnifferInterval(t.snifferInterval), elastic.SetHealthcheck(t.healthcheck), elastic.SetHealthcheckInterval(t.healthcheckInterval)) if err != nil { // Handle error return err } t.client = client // Use the IndexExists service to check if a specified index exists. exists, err := t.client.IndexExists(t.index).Do() if err != nil { return err } if exists { deleteIndex, err := t.client.DeleteIndex(t.index).Do() if err != nil { return err } if !deleteIndex.Acknowledged { return errors.New("delete index not acknowledged") } } // Create a new index. createIndex, err := t.client.CreateIndex(t.index).Do() if err != nil { return err } if !createIndex.Acknowledged { return errors.New("create index not acknowledged") } // Index a tweet (using JSON serialization) tweet1 := Tweet{User: "******", Message: "Take Five", Retweets: 0} _, err = t.client.Index(). Index(t.index). Type("tweet"). Id("1"). BodyJson(tweet1). Do() if err != nil { return err } // Index a second tweet (by string) tweet2 := `{"user" : "olivere", "message" : "It's a Raggy Waltz"}` _, err = t.client.Index(). Index(t.index). Type("tweet"). Id("2"). BodyString(tweet2). Do() if err != nil { return err } // Flush to make sure the documents got written. _, err = t.client.Flush().Index(t.index).Do() if err != nil { return err } return nil }
// CreateElasticSearchConfig creates an ElasticSearch configuration struct // which contains an ElasticSearch client for later use func CreateElasticSearchConfig(uri *url.URL) (*ElasticSearchConfig, error) { var esConfig ElasticSearchConfig opts, err := url.ParseQuery(uri.RawQuery) if err != nil { return nil, fmt.Errorf("failed to parser url's query string: %s", err) } // set the index for es,the default value is "heapster" esConfig.Index = ESIndex if len(opts["index"]) > 0 { esConfig.Index = opts["index"][0] } // Set the URL endpoints of the ES's nodes. Notice that when sniffing is // enabled, these URLs are used to initially sniff the cluster on startup. if len(opts["nodes"]) < 1 { return nil, fmt.Errorf("There is no node assigned for connecting ES cluster") } startupFns := []elastic.ClientOptionFunc{elastic.SetURL(opts["nodes"]...)} // If the ES cluster needs authentication, the username and secret // should be set in sink config.Else, set the Authenticate flag to false if len(opts["esUserName"]) > 0 && len(opts["esUserSecret"]) > 0 { startupFns = append(startupFns, elastic.SetBasicAuth(opts["esUserName"][0], opts["esUserSecret"][0])) } if len(opts["maxRetries"]) > 0 { maxRetries, err := strconv.Atoi(opts["maxRetries"][0]) if err != nil { return nil, fmt.Errorf("Failed to parse URL's maxRetries value into an int") } startupFns = append(startupFns, elastic.SetMaxRetries(maxRetries)) } if len(opts["healthCheck"]) > 0 { healthCheck, err := strconv.ParseBool(opts["healthCheck"][0]) if err != nil { return nil, fmt.Errorf("Failed to parse URL's healthCheck value into a bool") } startupFns = append(startupFns, elastic.SetHealthcheck(healthCheck)) } if len(opts["sniff"]) > 0 { sniff, err := strconv.ParseBool(opts["sniff"][0]) if err != nil { return nil, fmt.Errorf("Failed to parse URL's sniff value into a bool") } startupFns = append(startupFns, elastic.SetSniff(sniff)) } if len(opts["startupHealthcheckTimeout"]) > 0 { timeout, err := time.ParseDuration(opts["startupHealthcheckTimeout"][0] + "s") if err != nil { return nil, fmt.Errorf("Failed to parse URL's startupHealthcheckTimeout: %s", err.Error()) } startupFns = append(startupFns, elastic.SetHealthcheckTimeoutStartup(timeout)) } esConfig.EsClient, err = elastic.NewClient(startupFns...) if err != nil { return nil, fmt.Errorf("failed to create ElasticSearch client: %v", err) } glog.V(2).Infof("elasticsearch sink configure successfully") return &esConfig, nil }