diff --git a/CHANGELOG.md b/CHANGELOG.md
index 720ed4b41507ad9c2b04407e1a7a4a1944727bb7..f295a2028af4ea5b3d19ae34ef7b812f8be61368 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,7 @@
 
 ### Features
 
+- [#1694](https://github.com/influxdata/telegraf/pull/1694): Adding Gauge and Counter metric types.
 - [#1606](https://github.com/influxdata/telegraf/pull/1606): Remove carraige returns from exec plugin output on Windows
 - [#1674](https://github.com/influxdata/telegraf/issues/1674): elasticsearch input: configurable timeout.
 - [#1607](https://github.com/influxdata/telegraf/pull/1607): Massage metric names in Instrumental output plugin
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8aeb3a614f98ddbc26e08f889944afb695a2c3b4..ec7a353633eb24e75d52d806929bc941511deac1 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -32,7 +32,7 @@ Assuming you can already build the project, run these in the telegraf directory:
 
 1. `go get github.com/sparrc/gdm`
 1. `gdm restore`
-1. `gdm save`
+1. `GOOS=linux gdm save`
 
 ## Input Plugins
 
@@ -84,9 +84,9 @@ func (s *Simple) SampleConfig() string {
 
 func (s *Simple) Gather(acc telegraf.Accumulator) error {
     if s.Ok {
-        acc.Add("state", "pretty good", nil)
+        acc.AddFields("state", map[string]interface{}{"value": "pretty good"}, nil)
     } else {
-        acc.Add("state", "not great", nil)
+        acc.AddFields("state", map[string]interface{}{"value": "not great"}, nil)
     }
 
     return nil
@@ -97,6 +97,13 @@ func init() {
 }
 ```
 
+## Adding Typed Metrics
+
+In addition the the `AddFields` function, the accumulator also supports an
+`AddGauge` and `AddCounter` function. These functions are for adding _typed_
+metrics. Metric types are ignored for the InfluxDB output, but can be used
+for other outputs, such as [prometheus](https://prometheus.io/docs/concepts/metric_types/).
+
 ## Input Plugins Accepting Arbitrary Data Formats
 
 Some input plugins (such as
diff --git a/accumulator.go b/accumulator.go
index 02aee761d623a5456ade6ad5bc9a91f81b525450..bb6e4dc85091d35d546d40fd415674c295f8ea5d 100644
--- a/accumulator.go
+++ b/accumulator.go
@@ -2,7 +2,13 @@ package telegraf
 
 import "time"
 
+// Accumulator is an interface for "accumulating" metrics from input plugin(s).
+// The metrics are sent down a channel shared between all input plugins and then
+// flushed on the configured flush_interval.
 type Accumulator interface {
+	// AddFields adds a metric to the accumulator with the given measurement
+	// name, fields, and tags (and timestamp). If a timestamp is not provided,
+	// then the accumulator sets it to "now".
 	// Create a point with a value, decorating it with tags
 	// NOTE: tags is expected to be owned by the caller, don't mutate
 	// it after passing to Add.
@@ -11,15 +17,13 @@ type Accumulator interface {
 		tags map[string]string,
 		t ...time.Time)
 
-	// AddGauge is the same as AddFields, but will add the metric as a "Gauge"
-	// type
+	// AddGauge is the same as AddFields, but will add the metric as a "Gauge" type
 	AddGauge(measurement string,
 		fields map[string]interface{},
 		tags map[string]string,
 		t ...time.Time)
 
-	// AddCounter is the same as AddFields, but will add the metric as a "Counter"
-	// type
+	// AddCounter is the same as AddFields, but will add the metric as a "Counter" type
 	AddCounter(measurement string,
 		fields map[string]interface{},
 		tags map[string]string,