-
Notifications
You must be signed in to change notification settings - Fork 7
/
parser.go
131 lines (115 loc) · 3.28 KB
/
parser.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Package parser defines the Parser interface and implementations for the different
// test types, NDT, Paris Traceroute, and SideStream.
package parser
import (
"log"
"os"
"reflect"
"cloud.google.com/go/bigquery"
"github.com/m-lab/annotation-service/api/v2"
"github.com/m-lab/etl/etl"
"github.com/m-lab/etl/metrics"
"github.com/m-lab/etl/row"
)
func init() {
initParserVersion()
}
var gParserVersion = "uninitialized"
// initParserVersion initializes the gParserVersion variable for use by all parsers.
func initParserVersion() string {
release, ok := os.LookupEnv("RELEASE_TAG")
if ok && release != "empty_tag" {
gParserVersion = "https://github.com/m-lab/etl/tree/" + release
} else {
hash := os.Getenv("COMMIT_HASH")
if len(hash) >= 8 {
gParserVersion = "https://github.com/m-lab/etl/tree/" + hash[0:8]
} else {
gParserVersion = "local development"
}
}
return gParserVersion
}
// Version returns the parser version used by parsers to annotate data rows.
func Version() string {
return gParserVersion
}
// NewSinkParser creates an appropriate parser for a given data type.
// Eventually all datatypes will use this instead of NewParser.
func NewSinkParser(dt etl.DataType, sink row.Sink, table string, ann api.Annotator) etl.Parser {
switch dt {
case etl.ANNOTATION:
return NewAnnotationParser(sink, table, "", ann)
case etl.NDT5:
return NewNDT5ResultParser(sink, table, "", ann)
case etl.NDT7:
return NewNDT7ResultParser(sink, table, "", ann)
case etl.TCPINFO:
return NewTCPInfoParser(sink, table, "", ann)
default:
return nil
}
}
// NewParser creates an appropriate parser for a given data type.
// DEPRECATED - parsers should migrate to use NewSinkParser.
func NewParser(dt etl.DataType, ins etl.Inserter) etl.Parser {
switch dt {
case etl.NDT:
return NewNDTParser(ins)
case etl.NDT5:
sink, ok := ins.(row.Sink)
if !ok {
log.Printf("%v is not a Sink\n", ins)
log.Println(reflect.TypeOf(ins))
return nil
}
return NewNDT5ResultParser(sink, ins.TableBase(), ins.TableSuffix(), nil)
case etl.SS:
return NewDefaultSSParser(ins) // TODO fix this hack.
case etl.PT:
return NewPTParser(ins)
case etl.SW:
return NewDiscoParser(ins)
case etl.TCPINFO:
sink, ok := ins.(row.Sink)
if !ok {
log.Printf("%v is not a Sink\n", ins)
log.Println(reflect.TypeOf(ins))
return nil
}
return NewTCPInfoParser(sink, ins.TableBase(), ins.TableSuffix(), nil)
default:
return nil
}
}
//=====================================================================================
// Parser implementations
//=====================================================================================
// FakeRowStats provides trivial implementation of RowStats interface.
type FakeRowStats struct {
}
func (s *FakeRowStats) RowsInBuffer() int {
return 0
}
func (s *FakeRowStats) Accepted() int {
return 0
}
func (s *FakeRowStats) Committed() int {
return 0
}
func (s *FakeRowStats) Failed() int {
return 0
}
type NullParser struct {
FakeRowStats
}
func (np *NullParser) ParseAndInsert(meta map[string]bigquery.Value, testName string, test []byte) error {
metrics.TestCount.WithLabelValues("table", "null", "ok").Inc()
return nil
}
func (np *NullParser) TableName() string {
return "null-table"
}
func (np *NullParser) TaskError() error {
return nil
}