kraken
86 строк · 2.0 Кб
1// Copyright (c) 2016-2019 Uber Technologies, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14package networkevent15
16import (17"encoding/json"18"errors"19"fmt"20"os"21
22"github.com/uber/kraken/utils/log"23)
24
25// Producer emits events.
26type Producer interface {27Produce(e *Event)28Close() error29}
30
31type producer struct {32file *os.File33}
34
35// NewProducer creates a new Producer.
36func NewProducer(config Config) (Producer, error) {37var f *os.File38if config.Enabled {39if config.LogPath == "" {40return nil, errors.New("no log path supplied")41}42var flag int43if _, err := os.Stat(config.LogPath); err != nil {44if os.IsNotExist(err) {45flag = os.O_WRONLY | os.O_CREATE | os.O_EXCL46} else {47return nil, fmt.Errorf("stat: %s", err)48}49} else {50flag = os.O_WRONLY | os.O_APPEND51}52var err error53f, err = os.OpenFile(config.LogPath, flag, 0775)54if err != nil {55return nil, fmt.Errorf("open %d: %s", flag, err)56}57} else {58log.Warn("Kafka network events disabled")59}60return &producer{f}, nil61}
62
63// Produce emits a network event.
64func (p *producer) Produce(e *Event) {65if p.file == nil {66return67}68b, err := json.Marshal(e)69if err != nil {70log.Errorf("Error serializing network event to json: %s", err)71return72}73line := append(b, byte('\n'))74if _, err := p.file.Write(line); err != nil {75log.Errorf("Error writing network event: %s", err)76return77}78}
79
80// Close closes the producer.
81func (p *producer) Close() error {82if p.file == nil {83return nil84}85return p.file.Close()86}
87