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)
| 117 | // to the Encoder interface directly. The current version of the Encoder |
| 118 | // interface is kept for backwards compatibility. |
| 119 | func NewEncoder(w io.Writer, format Format) Encoder { |
| 120 | switch format { |
| 121 | case FmtProtoDelim: |
| 122 | return encoderCloser{ |
| 123 | encode: func(v *dto.MetricFamily) error { |
| 124 | _, err := protodelim.MarshalTo(w, v) |
| 125 | return err |
| 126 | }, |
| 127 | close: func() error { return nil }, |
| 128 | } |
| 129 | case FmtProtoCompact: |
| 130 | return encoderCloser{ |
| 131 | encode: func(v *dto.MetricFamily) error { |
| 132 | _, err := fmt.Fprintln(w, v.String()) |
| 133 | return err |
| 134 | }, |
| 135 | close: func() error { return nil }, |
| 136 | } |
| 137 | case FmtProtoText: |
| 138 | return encoderCloser{ |
| 139 | encode: func(v *dto.MetricFamily) error { |
| 140 | _, err := fmt.Fprintln(w, prototext.Format(v)) |
| 141 | return err |
| 142 | }, |
| 143 | close: func() error { return nil }, |
| 144 | } |
| 145 | case FmtText: |
| 146 | return encoderCloser{ |
| 147 | encode: func(v *dto.MetricFamily) error { |
| 148 | _, err := MetricFamilyToText(w, v) |
| 149 | return err |
| 150 | }, |
| 151 | close: func() error { return nil }, |
| 152 | } |
| 153 | case FmtOpenMetrics_0_0_1, FmtOpenMetrics_1_0_0: |
| 154 | return encoderCloser{ |
| 155 | encode: func(v *dto.MetricFamily) error { |
| 156 | _, err := MetricFamilyToOpenMetrics(w, v) |
| 157 | return err |
| 158 | }, |
| 159 | close: func() error { |
| 160 | _, err := FinalizeOpenMetrics(w) |
| 161 | return err |
| 162 | }, |
| 163 | } |
| 164 | } |
| 165 | panic(fmt.Errorf("expfmt.NewEncoder: unknown format %q", format)) |
| 166 | } |