NewEncoder returns a new encoder based on content type negotiation. All Encoder implementations returned by NewEncoder also implement Closer, and callers should always call the Close method. It is currently only required for FmtOpenMetrics, but a future (breaking) release will add the Close method t
(w io.Writer, format Format, options ...EncoderOption)
| 145 | // |
| 146 | // Extra options are ignored for all other formats. |
| 147 | func NewEncoder(w io.Writer, format Format, options ...EncoderOption) Encoder { |
| 148 | escapingScheme := format.ToEscapingScheme() |
| 149 | |
| 150 | switch format.FormatType() { |
| 151 | case TypeProtoDelim: |
| 152 | return encoderCloser{ |
| 153 | encode: func(v *dto.MetricFamily) error { |
| 154 | _, err := protodelim.MarshalTo(w, model.EscapeMetricFamily(v, escapingScheme)) |
| 155 | return err |
| 156 | }, |
| 157 | close: func() error { return nil }, |
| 158 | } |
| 159 | case TypeProtoCompact: |
| 160 | return encoderCloser{ |
| 161 | encode: func(v *dto.MetricFamily) error { |
| 162 | _, err := fmt.Fprintln(w, model.EscapeMetricFamily(v, escapingScheme).String()) |
| 163 | return err |
| 164 | }, |
| 165 | close: func() error { return nil }, |
| 166 | } |
| 167 | case TypeProtoText: |
| 168 | return encoderCloser{ |
| 169 | encode: func(v *dto.MetricFamily) error { |
| 170 | _, err := fmt.Fprintln(w, prototext.Format(model.EscapeMetricFamily(v, escapingScheme))) |
| 171 | return err |
| 172 | }, |
| 173 | close: func() error { return nil }, |
| 174 | } |
| 175 | case TypeTextPlain: |
| 176 | return encoderCloser{ |
| 177 | encode: func(v *dto.MetricFamily) error { |
| 178 | _, err := MetricFamilyToText(w, model.EscapeMetricFamily(v, escapingScheme)) |
| 179 | return err |
| 180 | }, |
| 181 | close: func() error { return nil }, |
| 182 | } |
| 183 | case TypeOpenMetrics: |
| 184 | return encoderCloser{ |
| 185 | encode: func(v *dto.MetricFamily) error { |
| 186 | _, err := MetricFamilyToOpenMetrics(w, model.EscapeMetricFamily(v, escapingScheme), options...) |
| 187 | return err |
| 188 | }, |
| 189 | close: func() error { |
| 190 | _, err := FinalizeOpenMetrics(w) |
| 191 | return err |
| 192 | }, |
| 193 | } |
| 194 | } |
| 195 | panic(fmt.Errorf("expfmt.NewEncoder: unknown format %q", format)) |
| 196 | } |
searching dependent graphs…