func (isrv *indexerServer) IndexMessage(ctx context.Context, msg *pb.Message) (*pb.Response, error) { statIncrementCnt(&stat.msgCnt) tags := msg.Header.GetTags() if len(tags) > maxTagsInMessage { return nil, fmt.Errorf("too many tags in message %d", len(tags)) } for _, tag := range tags { if len(tag) > maxTagLength { return nil, fmt.Errorf("too long tag name %d", len(tag)) } } frames := msg.GetFrames() for i := 0; i < len(frames)-1; i++ { if frames[i].GetName() > frames[i+1].GetName() { return nil, fmt.Errorf("frames must be sorted") } } start := time.Now() value, err := msg.Marshal() statIncrementTook(&stat.msgSerializeTook, start) statIncrementSize(&stat.msgSendToKafkaSize, len(value)) if err != nil { return nil, fmt.Errorf("failed to marshal message: %v", err) } start = time.Now() // partition, offset := int32(0), int64(0) partition, offset, err := isrv.producer.SendMessage(&sarama.ProducerMessage{ Topic: persistedTopic, Value: sarama.ByteEncoder(value), }) statIncrementTook(&stat.msgSendToKafkaTook, start) if err != nil { return nil, fmt.Errorf("failed to store message: %v", err) } start = time.Now() isrv.appendIndexCh <- &indexBuilderMessage{ tags: tags, partition: partition, offset: offset, } statIncrementTook(&stat.msgSendToChTook, start) return &pb.Response{}, nil }