func dialKafka(kn kafkaNotify) (kafkaConn, error) { if !kn.Enable { return kafkaConn{}, errNotifyNotEnabled } if kn.Topic == "" { return kafkaConn{}, fmt.Errorf( "Kafka Notifier Error: Topic was not specified in configuration") } config := sarama.NewConfig() // Wait for all in-sync replicas to ack the message config.Producer.RequiredAcks = sarama.WaitForAll // Retry up to 10 times to produce the message config.Producer.Retry.Max = 10 config.Producer.Return.Successes = true p, err := sarama.NewSyncProducer(kn.Brokers, config) if err != nil { return kafkaConn{}, fmt.Errorf( "Kafka Notifier Error: Failed to start producer: %v", err, ) } return kafkaConn{p, kn.Topic}, nil }
func (z *zipkin) run() { t := time.NewTicker(z.opts.BatchInterval) c, err := sarama.NewClient(z.opts.Collectors, sarama.NewConfig()) if err != nil { return } p, err := sarama.NewSyncProducerFromClient(c) if err != nil { return } var buf []*trace.Span for { select { case s := <-z.spans: buf = append(buf, s) if len(buf) >= z.opts.BatchSize { go z.send(buf, p) buf = nil } case <-t.C: // flush if len(buf) > 0 { go z.send(buf, p) buf = nil } case <-z.exit: // exit t.Stop() p.Close() return } } }
// Configure initializes this consumer with values from a plugin config. func (cons *Kafka) Configure(conf core.PluginConfig) error { err := cons.ConsumerBase.Configure(conf) if err != nil { return err } if !conf.HasValue("Servers") { return core.NewConsumerError("No servers configured for consumer.Kafka") } cons.servers = conf.GetStringArray("Servers", []string{}) cons.topic = conf.GetString("Topic", "default") cons.offsetFile = conf.GetString("OffsetFile", "") cons.persistTimeout = time.Duration(conf.GetInt("PresistTimoutMs", 5000)) * time.Millisecond cons.offsets = make(map[int32]int64) cons.MaxPartitionID = 0 cons.config = kafka.NewConfig() cons.config.ClientID = conf.GetString("ClientId", "gollum") cons.config.ChannelBufferSize = conf.GetInt("MessageBufferCount", 256) cons.config.Net.MaxOpenRequests = conf.GetInt("MaxOpenRequests", 5) cons.config.Net.DialTimeout = time.Duration(conf.GetInt("ServerTimeoutSec", 30)) * time.Second cons.config.Net.ReadTimeout = cons.config.Net.DialTimeout cons.config.Net.WriteTimeout = cons.config.Net.DialTimeout cons.config.Metadata.Retry.Max = conf.GetInt("ElectRetries", 3) cons.config.Metadata.Retry.Backoff = time.Duration(conf.GetInt("ElectTimeoutMs", 250)) * time.Millisecond cons.config.Metadata.RefreshFrequency = time.Duration(conf.GetInt("MetadataRefreshMs", 10000)) * time.Millisecond cons.config.Consumer.Fetch.Min = int32(conf.GetInt("MinFetchSizeByte", 1)) cons.config.Consumer.Fetch.Max = int32(conf.GetInt("MaxFetchSizeByte", 0)) cons.config.Consumer.Fetch.Default = int32(conf.GetInt("MaxFetchSizeByte", 32768)) cons.config.Consumer.MaxWaitTime = time.Duration(conf.GetInt("FetchTimeoutMs", 250)) * time.Millisecond offsetValue := strings.ToLower(conf.GetString("DefaultOffset", kafkaOffsetNewest)) switch offsetValue { case kafkaOffsetNewest: cons.defaultOffset = kafka.OffsetNewest case kafkaOffsetOldest: cons.defaultOffset = kafka.OffsetOldest default: cons.defaultOffset, _ = strconv.ParseInt(offsetValue, 10, 64) fileContents, err := ioutil.ReadFile(cons.offsetFile) if err != nil { return err } // Decode the JSON file into the partition -> offset map encodedOffsets := make(map[string]int64) err = json.Unmarshal(fileContents, &encodedOffsets) if err != nil { return err } for k, v := range encodedOffsets { id, err := strconv.Atoi(k) if err != nil { return err } cons.offsets[int32(id)] = v } } return nil }
// Configure initializes this producer with values from a plugin config. func (prod *Kafka) Configure(conf core.PluginConfig) error { err := prod.ProducerBase.Configure(conf) if err != nil { return err } if !conf.HasValue("Servers") { return core.NewProducerError("No servers configured for producer.Kafka") } prod.servers = conf.GetStringArray("Servers", []string{}) prod.topic = conf.GetStreamMap("Topic", "") prod.clientID = conf.GetString("ClientId", "gollum") prod.config = kafka.NewConfig() prod.config.ClientID = conf.GetString("ClientId", "gollum") prod.config.ChannelBufferSize = conf.GetInt("MessageBufferCount", 256) prod.config.Net.MaxOpenRequests = conf.GetInt("MaxOpenRequests", 5) prod.config.Net.DialTimeout = time.Duration(conf.GetInt("ServerTimeoutSec", 30)) * time.Second prod.config.Net.ReadTimeout = prod.config.Net.DialTimeout prod.config.Net.WriteTimeout = prod.config.Net.DialTimeout prod.config.Metadata.Retry.Max = conf.GetInt("ElectRetries", 3) prod.config.Metadata.Retry.Backoff = time.Duration(conf.GetInt("ElectTimeoutMs", 250)) * time.Millisecond prod.config.Metadata.RefreshFrequency = time.Duration(conf.GetInt("MetadataRefreshMs", 10000)) * time.Millisecond prod.config.Producer.MaxMessageBytes = conf.GetInt("BatchSizeMaxKB", 1<<10) << 10 prod.config.Producer.RequiredAcks = kafka.RequiredAcks(conf.GetInt("RequiredAcks", int(kafka.WaitForLocal))) prod.config.Producer.Timeout = time.Duration(conf.GetInt("TimoutMs", 1500)) * time.Millisecond prod.config.Producer.Return.Errors = true prod.config.Producer.Return.Successes = false switch strings.ToLower(conf.GetString("Compression", compressNone)) { default: fallthrough case compressNone: prod.config.Producer.Compression = kafka.CompressionNone case compressGZIP: prod.config.Producer.Compression = kafka.CompressionGZIP case compressSnappy: prod.config.Producer.Compression = kafka.CompressionSnappy } switch strings.ToLower(conf.GetString("Partitioner", partRandom)) { case partRandom: prod.config.Producer.Partitioner = kafka.NewRandomPartitioner case partRoundrobin: prod.config.Producer.Partitioner = kafka.NewRoundRobinPartitioner default: fallthrough case partHash: prod.config.Producer.Partitioner = kafka.NewHashPartitioner } prod.config.Producer.Flush.Bytes = conf.GetInt("BatchSizeByte", 8192) prod.config.Producer.Flush.Messages = conf.GetInt("BatchMinCount", 1) prod.config.Producer.Flush.Frequency = time.Duration(conf.GetInt("BatchTimeoutSec", 3)) * time.Second prod.config.Producer.Flush.MaxMessages = conf.GetInt("BatchMaxCount", 0) prod.config.Producer.Retry.Max = conf.GetInt("SendRetries", 3) prod.config.Producer.Retry.Backoff = time.Duration(conf.GetInt("SendTimeoutMs", 100)) * time.Millisecond return nil }