Repository: kentik/ktranslate
Pull request #116 (2021-08-27 21:53:45)

Moving to separate the staging build from main release
Don't rely on staging being built on the staging build. 

i3149: Couple of bug fixes pushed into here, along with log updates from Alba. 

Patch:
diff --git a/.github/workflows/publish-prod.yml b/.github/workflows/publish-prod.yml
index 1cc8725..8ef6095 100644
--- a/.github/workflows/publish-prod.yml
+++ b/.github/workflows/publish-prod.yml
@@ -14,6 +14,15 @@ jobs:
           submodules: recursive
           fetch-depth: 0         # Fetch all history for .GitInfo and .Lastmod
 
+      - name: Set Version
+        run: |
+           echo KENTIK_KTRANSLATE_VERSION=`date +"kt-%Y-%m-%d-${GITHUB_RUN_ID}"` >> $GITHUB_ENV
+
+      - name: Setup Go
+        uses: actions/setup-go@v2
+        with:
+          go-version: '1.16.7'
+
       - name: Set up QEMU
         uses: docker/setup-qemu-action@v1
 
@@ -26,17 +35,46 @@ jobs:
           username: ${{ secrets.DOCKERHUB_USERNAME }}
           password: ${{ secrets.DOCKERHUB_TOKEN }}
 
-      - name: Get staging image
+      - name: Install dependencies
+        run: sudo apt-get install make libpcap-dev golint
+
+      - name: Install MM DBs
         run: |
-          docker pull kentik/ktranslate:staging
+          MM_DOWNLOAD_KEY=${{ secrets.MM_DOWNLOAD_KEY }} ./bin/get_mm.sh
+
+      - name: Install SNMP Profiles
+        uses: actions/checkout@main
+        with:
+          repository: kentik/snmp-profiles
+          path: ./config/profiles
 
-      - name: Integration test
+      - name: Run build
         run: |
-          ./testing/test_staging.sh
+          echo ${{ env.KENTIK_KTRANSLATE_VERSION }}
+          KENTIK_KTRANSLATE_VERSION=${{ env.KENTIK_KTRANSLATE_VERSION }} make
+
+      - name: Run vet & lint
+        run: |
+          go vet .
+          golint .
+
+      - name: Run testing
+        run: make test
+
+      - name: Create docker image
+        run: make docker
 
       - name: Publish docker image
         run: |
-          docker tag kentik/ktranslate:staging kentik/ktranslate:v2
+          docker tag ktranslate:v2 kentik/ktranslate:v2
           docker push kentik/ktranslate:v2
-          docker tag kentik/ktranslate:staging kentik/ktranslate:latest
-          docker push kentik/ktranslate:latest
\ No newline at end of file
+          docker tag ktranslate:v2 kentik/ktranslate:${{ env.KENTIK_KTRANSLATE_VERSION }}
+          docker push kentik/ktranslate:${{ env.KENTIK_KTRANSLATE_VERSION }}
+          docker tag ktranslate:v2 kentik/ktranslate:latest
+          docker push kentik/ktranslate:latest
+
+      - name: Publish binary
+        uses: actions/upload-artifact@v2
+        with:
+          name: ktranslate
+          path: bin/ktranslate
\ No newline at end of file
diff --git a/.github/workflows/publish-staging.yml b/.github/workflows/publish-staging.yml
index 6218249..95f16ec 100644
--- a/.github/workflows/publish-staging.yml
+++ b/.github/workflows/publish-staging.yml
@@ -68,8 +68,6 @@ jobs:
         run: |
           docker tag ktranslate:v2 kentik/ktranslate:staging
           docker push kentik/ktranslate:staging
-          docker tag ktranslate:v2 kentik/ktranslate:${{ env.KENTIK_KTRANSLATE_VERSION }}
-          docker push kentik/ktranslate:${{ env.KENTIK_KTRANSLATE_VERSION }}
 
       - name: Publish binary
         uses: actions/upload-artifact@v2
diff --git a/Dockerfile b/Dockerfile
index be923bb..925ee54 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -21,7 +21,6 @@ RUN set -eux; ln -sv /etc/ktranslate/mibs.db /etc/mib.db; ls -l /etc/mib.db/
 COPY bin/ktranslate /usr/local/bin/
 
 USER ktranslate
-ENTRYPOINT ["ktranslate", "-metalisten", "0.0.0.0:8083", "-listen", "0.0.0.0:8082", "-mapping", "/etc/ktranslate/config.json", "-geo", "/etc/ktranslate/GeoLite2-Country.mmdb", "-udrs", "/etc/ktranslate/udr.csv", "-api_devices", "/etc/ktranslate/devices.json", "-asn", "/etc/ktranslate/GeoLite2-ASN.mmdb", "-log_level", "info"]
+ENTRYPOINT ["ktranslate", "-listen", "0.0.0.0:8082", "-mapping", "/etc/ktranslate/config.json", "-geo", "/etc/ktranslate/GeoLite2-Country.mmdb", "-udrs", "/etc/ktranslate/udr.csv", "-api_devices", "/etc/ktranslate/devices.json", "-asn", "/etc/ktranslate/GeoLite2-ASN.mmdb", "-log_level", "info"]
 
 EXPOSE 8082
-EXPOSE 8083
diff --git a/pkg/cat/kkc.go b/pkg/cat/kkc.go
index 3e155aa..c76a6c4 100644
--- a/pkg/cat/kkc.go
+++ b/pkg/cat/kkc.go
@@ -126,7 +126,7 @@ func NewKTranslate(config *Config, log logger.ContextL, registry go_metrics.Regi
 
 	m, err := maps.LoadMapper(config.TagMapType, log.GetLogger().GetUnderlyingLogger())
 	if err != nil {
-		kc.log.Errorf("Cannot open tag service %v", err)
+		kc.log.Errorf("There was an error when opening the tag service: %v.", err)
 		return nil, err
 	}
 	kc.tagMap = m
@@ -135,7 +135,7 @@ func NewKTranslate(config *Config, log logger.ContextL, registry go_metrics.Regi
 	if config.GeoMapping != "" {
 		geo, err := patricia.NewMapFromMM(config.GeoMapping, log)
 		if err != nil {
-			kc.log.Errorf("Error with geo service: %v", err)
+			kc.log.Errorf("There was an error with geo service: %v.", err)
 			return nil, err
 		} else {
 			kc.geo = geo
@@ -146,7 +146,7 @@ func NewKTranslate(config *Config, log logger.ContextL, registry go_metrics.Regi
 	if config.AsnMapping != "" {
 		asn, err := patricia.NewMapFromMM(config.AsnMapping, log)
 		if err != nil {
-			kc.log.Errorf("Error with asn service %v", err)
+			kc.log.Errorf("There was an error with the asn service: &v.", err)
 			return nil, err
 		} else {
 			kc.asn = asn
@@ -396,7 +396,7 @@ func (kc *KTranslate) handleFlow(w http.ResponseWriter, r *http.Request) {
 	if r.Header.Get("Content-Encoding") == "gzip" {
 		z, err := gzip.NewReader(r.Body)
 		if err != nil {
-			kc.log.Errorf("Decompressing body: %+v", err)
+			kc.log.Errorf("There was an eror when decompressing the content: %+v.", err)
 			http.Error(w, err.Error(), http.StatusInternalServerError)
 			return
 		}
@@ -416,7 +416,7 @@ func (kc *KTranslate) handleFlow(w http.ResponseWriter, r *http.Request) {
 	if contentLengthString != "" {
 		size, err := strconv.Atoi(contentLengthString)
 		if err != nil {
-			kc.log.Errorf("Reading content length: %+v", err)
+			kc.log.Errorf("There was an error when getting the content length: %v.", err)
 			http.Error(w, err.Error(), http.StatusInternalServerError)
 			return
 		}
@@ -432,7 +432,7 @@ func (kc *KTranslate) handleFlow(w http.ResponseWriter, r *http.Request) {
 	_, err = bodyBuffer.ReadFrom(body)
 
 	if err != nil {
-		kc.log.Errorf("Reading body: %+v", err)
+		kc.log.Errorf("There was an error when reading the body content: %v.", err)
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
@@ -561,7 +561,7 @@ func (kc *KTranslate) sendToSinks(ctx context.Context) error {
 				if len(export) > 0 {
 					res, err := kc.formatRollup.Rollup(export)
 					if err != nil {
-						kc.log.Errorf("Cannot handle rollup: %v", err)
+						kc.log.Errorf("There was an error when handling rollup: %v.", err)
 					} else {
 						kc.msgsc <- res
 					}
@@ -621,7 +621,7 @@ func (kc *KTranslate) handleInput(ctx context.Context, msgs []*kt.JCHF, serBuf [
 			}
 			ser, err := seri(msgs[last:batch], serBuf)
 			if err != nil {
-				kc.log.Errorf("Converting to native: %v", err)
+				kc.log.Errorf("There was an error when converting to native: %v.", err)
 			} else if ser != nil {
 				ser.CB = cb
 				kc.msgsc <- ser
@@ -722,7 +722,7 @@ func (kc *KTranslate) monitorAlphaChan(ctx context.Context, i int, seri func([]*
 			}
 			ser, err := seri(msgs[0:keep], serBuf)
 			if err != nil {
-				kc.log.Errorf("Converting to native: %v", err)
+				kc.log.Errorf("There was an error when converting to native: %v.", err)
 			} else {
 				kc.msgsc <- ser
 			}
@@ -747,7 +747,7 @@ func (kc *KTranslate) monitorAlphaChan(ctx context.Context, i int, seri func([]*
 			case jflow := <-kc.jchfChans[i]: // non blocking select on this chan.
 				err := kc.flowToJCHF(ctx, citycache, regioncache, jflow, f, currentTime, tagcache)
 				if err != nil {
-					kc.log.Errorf("Cannot convert to json: %v", err)
+					kc.log.Errorf("There was an error when converting to json: %v.", err)
 					jflow.Reset()
 					kc.jchfChans[i] <- jflow
 					continue
@@ -816,7 +816,7 @@ func (kc *KTranslate) listenHTTP() {
 
 	// err is always non-nil -- the http server stopped.
 	if err != http.ErrServerClosed {
-		kc.log.Errorf("While bringing up HTTP system on %s -- %v", kc.config.Listen, err)
+		kc.log.Errorf("There was an error when bringing up the HTTP system on %s: %v.", kc.config.Listen, err)
 		panic(err)
 	}
 	kc.log.Infof("HTTP server shut down on %s -- %v", kc.config.Listen, err)
diff --git a/pkg/eggs/baseserver/meta.go b/pkg/eggs/baseserver/meta.go
index a2f3a70..6983633 100644
--- a/pkg/eggs/baseserver/meta.go
+++ b/pkg/eggs/baseserver/meta.go
@@ -260,7 +260,7 @@ func (ms *MetaServer) endpointGetFeature(w http.ResponseWriter, r *http.Request)
 	ms.writeCommonHeaders(w)
 	featureName := mux.Vars(r)["featureName"]
 	if !features.IsValidFeatureName(featureName) {
-		ms.writeError(w, fmt.Errorf("Invalid feature name: %s", featureName), http.StatusNotFound)
+		ms.writeError(w, fmt.Errorf("You used an unsupported feature name: %s.", featureName), http.StatusNotFound)
 		return
 	}
 	enabledGlobally := GetGlobalBaseServer().GetFeatureService().EnabledGlobally(featureName)
@@ -430,7 +430,7 @@ func (ms *MetaServer) getLogLevelFromRequest(r *http.Request) (logger.Level, str
 
 	level, ok := logger.CfgLevels[levelString]
 	if !ok {
-		return level, levelString, fmt.Errorf("log level not found: %s", levelString)
+		return level, levelString, fmt.Errorf("Invalid log level: %s.", levelString)
 	}
 	return level, levelString, nil
 }
diff --git a/pkg/eggs/features/service.go b/pkg/eggs/features/service.go
index c684569..627ea6b 100644
--- a/pkg/eggs/features/service.go
+++ b/pkg/eggs/features/service.go
@@ -1,8 +1,8 @@
 package features
 
 import (
-	"github.com/kentik/ktranslate/pkg/eggs/properties"
 	"fmt"
+	"github.com/kentik/ktranslate/pkg/eggs/properties"
 )
 
 type stdFeatureService struct {
@@ -17,7 +17,7 @@ func NewFeatureService(propsvc properties.PropertyService) *stdFeatureService {
 
 func (dfsvc *stdFeatureService) EnabledGlobally(featureName string) bool {
 	if !IsValidFeatureName(featureName) {
-		panic(fmt.Errorf("Invalid feature name '%s'", featureName))
+		panic(fmt.Errorf("You used an unsupported feature name: %v.", featureName))
 	}
 
 	return dfsvc.Enabled(featureName)
@@ -26,7 +26,7 @@ func (dfsvc *stdFeatureService) EnabledGlobally(featureName string) bool {
 func (dfsvc *stdFeatureService) Enabled(featureName string, sub ...interface{}) bool {
 
 	if !IsValidFeatureName(featureName) {
-		panic(fmt.Errorf("Invalid feature name '%s'", featureName))
+		panic(fmt.Errorf("You used an unsupported feature name: %v.", featureName))
 	}
 
 	return dfsvc.propsvc.GetBoolSub(fmt.Sprintf("features.%s", featureName), false, sub...).Bool()
diff --git a/pkg/eggs/preconditions/preconditions.go b/pkg/eggs/preconditions/preconditions.go
index 2415e38..fcb1e4f 100644
--- a/pkg/eggs/preconditions/preconditions.go
+++ b/pkg/eggs/preconditions/preconditions.go
@@ -44,7 +44,7 @@ func AssertUniqueStrings(s []string) []string {
 	for i := 0; i < len(s); i++ {
 		for j := i + 1; j < len(s); j++ {
 			if s[i] == s[j] {
-				panic(fmt.Errorf("duplicate elements found in sequence '%+v'", s))
+				panic(fmt.Errorf("You used duplicated elements in sequence: '%+v'.", s))
 			}
 		}
 	}
diff --git a/pkg/eggs/preconditions/validate.go b/pkg/eggs/preconditions/validate.go
index bd1f357..5ca03c1 100644
--- a/pkg/eggs/preconditions/validate.go
+++ b/pkg/eggs/preconditions/validate.go
@@ -16,17 +16,17 @@ type validatorFunc func(reflect.StructField, reflect.Value)
 var validators = map[string]validatorFunc{
 	"nil": func(field reflect.StructField, value reflect.Value) {
 		if !value.IsNil() {
-			panic(fmt.Errorf("Field %s must be nil", field.Name))
+			panic(fmt.Errorf("The %s field must be null.", field.Name))
 		}
 	},
 	"not_nil": func(field reflect.StructField, value reflect.Value) {
 		if value.IsNil() {
-			panic(fmt.Errorf("Field %s must not be nil", field.Name))
+			panic(fmt.Errorf("The %s field must not be null.", field.Name))
 		}
 	},
 	"not_empty": func(field reflect.StructField, value reflect.Value) {
 		if value.Len() == 0 {
-			panic(fmt.Errorf("Field %s must not be empty", field.Name))
+			panic(fmt.Errorf("You need to fill in the %s field.", field.Name))
 		}
 	},
 }
diff --git a/pkg/eggs/properties/helpers.go b/pkg/eggs/properties/helpers.go
index 72fbbec..e1e125c 100644
--- a/pkg/eggs/properties/helpers.go
+++ b/pkg/eggs/properties/helpers.go
@@ -16,21 +16,21 @@ func loadPropertiesFromFilesystem(root string) (map[string]string, error) {
 
 	visit := func(path string, f os.FileInfo, err error) error {
 		if err != nil {
-			return fmt.Errorf("loadPropertiesFromFilesystem: could not walk path '%s': %+v", path, err)
+			return fmt.Errorf("There was an error when accessing the following path: %s: %v.", path, err)
 		}
 		if path != root && len(path) > len(root)+1 {
 			stat, err := os.Stat(path)
 			if err != nil {
-				return fmt.Errorf("loadPropertiesFromFilesystem: could not stat '%s': %+v", path, err)
+				return fmt.Errorf("There was an error when accessing the following path: %s: %v.", path, err)
 			}
 
 			if stat.Size() > fileSizeLimit {
-				return fmt.Errorf("loadPropertiesFromFilesystem: '%s' is too large (%d > %d)", path, stat.Size(), fileSizeLimit)
+				return fmt.Errorf("The %s files is too big. The file is %d KB and the max is %d KB.", path, stat.Size(), fileSizeLimit)
 			}
 
 			content, err := ioutil.ReadFile(path)
 			if err != nil {
-				return fmt.Errorf("loadPropertiesFromFilesystem: could not read '%s': %+v", path, err)
+				return fmt.Errorf("There was an error when accessing the following path: %s: %v.", path, err)
 			}
 			propName := path[len(root)+1:]
 			props[propName] = string(content)
@@ -39,7 +39,7 @@ func loadPropertiesFromFilesystem(root string) (map[string]string, error) {
 	}
 
 	if err := filepath.Walk(root, visit); err != nil {
-		return nil, fmt.Errorf("loadPropertiesFromFilesystem: could not walk root '%s': %+v", root, err)
+		return nil, fmt.Errorf("There was an error when accessing the following path: %s: %v.", root, err)
 	}
 	return props, nil
 }
diff --git a/pkg/eggs/properties/service.go b/pkg/eggs/properties/service.go
index 8cb7047..ab8f7df 100644
--- a/pkg/eggs/properties/service.go
+++ b/pkg/eggs/properties/service.go
@@ -44,7 +44,7 @@ func (propsvc *stdPropertyService) GetProperty(name string) (string, bool) {
 
 func (propsvc *stdPropertyService) GetPropertySub(propertyName string, sub ...interface{}) (string, bool) {
 	if !IsValidPropertySubName(propertyName) {
-		panic(fmt.Errorf("Invalid property sub name '%s'", propertyName))
+		panic(fmt.Errorf("You used an unsupported property sub name: %s.", propertyName))
 	}
 
 	if len(sub)%2 != 0 {
diff --git a/pkg/formats/ddog/ddog.go b/pkg/formats/ddog/ddog.go
index a5af8fe..df4ab48 100644
--- a/pkg/formats/ddog/ddog.go
+++ b/pkg/formats/ddog/ddog.go
@@ -48,7 +48,7 @@ func NewFormat(log logger.Underlying, compression kt.Compression) (*DDogFormat,
 	case kt.CompressionGzip:
 		jf.doGz = true
 	default:
-		return nil, fmt.Errorf("Invalid compression (%s): format ddog only supports none|gzip", compression)
+		return nil, fmt.Errorf("You used an unsupported compression format: %s. For ddog, use gzip or no compression at all.", compression)
 	}
 
 	return jf, nil
diff --git a/pkg/formats/format.go b/pkg/formats/format.go
index 3bc7de3..47c5615 100644
--- a/pkg/formats/format.go
+++ b/pkg/formats/format.go
@@ -59,6 +59,6 @@ func NewFormat(format Format, log logger.Underlying, compression kt.Compression)
 	case FORMAT_DATADOG:
 		return ddog.NewFormat(log, compression)
 	default:
-		return nil, fmt.Errorf("Unknown format %v", format)
+		return nil, fmt.Errorf("You used an unsupported format: %v.", format)
 	}
 }
diff --git a/pkg/formats/netflow/netflow.go b/pkg/formats/netflow/netflow.go
index 784fcda..227baa5 100644
--- a/pkg/formats/netflow/netflow.go
+++ b/pkg/formats/netflow/netflow.go
@@ -108,11 +108,11 @@ func NewFormat(log logger.Underlying, comp kt.Compression) (*NetflowFormat, erro
 	case "netflow9":
 		ipf.version = netflow9.Version
 	default:
-		return nil, fmt.Errorf("Invalid netflow version: %s. Supported (netflow9|ipfix)", *Version)
+		return nil, fmt.Errorf("You used an unsupported netflow version: %s. Use netflow9 or ipfix.", *Version)
 	}
 
 	if comp != kt.CompressionNone {
-		return nil, fmt.Errorf("IPFix format does not work with any compression")
+		return nil, fmt.Errorf("You cannot use compression on IPFix data.")
 	}
 
 	ipf.Infof("Netflow formatter running with version %d", ipf.version)
@@ -127,7 +127,7 @@ func (f *NetflowFormat) To(msgs []*kt.JCHF, serBuf []byte) (*kt.Output, error) {
 	case ipfix.Version:
 		return f.packIpfix(msgs, serBuf)
 	default:
-		return nil, fmt.Errorf("Invalid version")
+		return nil, fmt.Errorf("You used an unsupported version.")
 	}
 }
 
diff --git a/pkg/formats/netflow/template-tracker.go b/pkg/formats/netflow/template-tracker.go
index 2569cf9..73cdfec 100644
--- a/pkg/formats/netflow/template-tracker.go
+++ b/pkg/formats/netflow/template-tracker.go
@@ -24,7 +24,7 @@ func (ipf *NetflowFormat) addTemplate(srcId uint32, templateId uint16, kind stri
 		if ipf.templateTracker[srcId][templateId] == "" {
 			ipf.Debugf("received new %s template for observation domain id %d, template id %d:  %s", kind, srcId, templateId, templateStr)
 		} else {
-			ipf.Warnf("received modified %s template for observation domain id %d, template id %d:  %s", kind, srcId, templateId, templateStr)
+			ipf.Warnf("The %s template was modified for the %d observation domain ID. Template ID %d: %s.", kind, srcId, templateId, templateStr)
 		}
 		ipf.templateTracker[srcId][templateId] = templateStr
 	}
diff --git a/pkg/formats/nrm/nrm.go b/pkg/formats/nrm/nrm.go
index de6a3aa..379b9f4 100644
--- a/pkg/formats/nrm/nrm.go
+++ b/pkg/formats/nrm/nrm.go
@@ -83,7 +83,7 @@ func NewFormat(log logger.Underlying, compression kt.Compression) (*NRMFormat, e
 	if per, err := strconv.Atoi(dp); err == nil {
 		da := os.Getenv(DO_DEMO_AMP)
 		if amp, err := strconv.Atoi(da); err != nil {
-			return nil, fmt.Errorf("Bad value for demo amplitude: %s. Be sure to set %s", da, DO_DEMO_AMP)
+			return nil, fmt.Errorf("You used an unsupported value for demo amplitude: %s. Ensure you setup the %s variable.", da, DO_DEMO_AMP)
 		} else {
 			jf.demo = NewDemozer(jf, uint32(per), uint32(amp))
 			jf.Infof("Running Demo System with period of %d and amplitude of %d", per, amp)
@@ -96,7 +96,7 @@ func NewFormat(log logger.Underlying, compression kt.Compression) (*NRMFormat, e
 	case kt.CompressionGzip:
 		jf.doGz = true
 	default:
-		return nil, fmt.Errorf("Invalid compression (%s): format nrm only supports none|gzip", compression)
+		return nil, fmt.Errorf("You used an unsupported compression format: %s. For nrm, use gzip or no compression at all.", compression)
 	}
 
 	return jf, nil
@@ -207,7 +207,7 @@ func (f *NRMFormat) toNRMetric(in *kt.JCHF) []NRMetric {
 		// This is actually an event, send out as an event to sink directly.
 		err := events.SendEvent(in, f.doGz, f.EventChan)
 		if err != nil {
-			f.Errorf("Cannot send event on -- %v", err)
+			f.Errorf("There was an error when sending an event: %v.", err)
 		}
 	default:
 		f.mux.Lock()
diff --git a/pkg/inputs/snmp/disco.go b/pkg/inputs/snmp/disco.go
index 52881f1..1f9de54 100644
--- a/pkg/inputs/snmp/disco.go
+++ b/pkg/inputs/snmp/disco.go
@@ -33,16 +33,16 @@ func Discover(ctx context.Context, snmpFile string, log logger.ContextL) error {
 	}
 
 	if conf.Disco == nil {
-		return fmt.Errorf("Missing the discovery config %+v", conf)
+		return fmt.Errorf("The discovery configuration is not set: %+v.", conf)
 	}
 
 	if conf.Global == nil || conf.Global.MibProfileDir == "" {
-		return fmt.Errorf("Add a global section and mib profile directory %+v", conf)
+		return fmt.Errorf("You need to specify a global section and mib profile directory: %v.", conf)
 	}
 
 	if conf.Disco.AddDevices { // Verify that the output is writeable before diving into discoing.
 		if err := addDevices(nil, snmpFile, conf, true, log); err != nil {
-			return fmt.Errorf("Can not write snmp config file %s - %v", snmpFile, err)
+			return fmt.Errorf("There was an error when writing the %s SNMP configuration file: %v.", snmpFile, err)
 		}
 	}
 
@@ -59,7 +59,7 @@ func Discover(ctx context.Context, snmpFile string, log logger.ContextL) error {
 	// Use this for auto-discovering metrics to pull.
 	mdb, err := mibs.NewMibDB(conf.Global.MibDB, conf.Global.MibProfileDir, log)
 	if err != nil {
-		return fmt.Errorf("Cannot set up mibDB -- db: %s, profiles: %s -> %v", conf.Global.MibDB, conf.Global.MibProfileDir, err)
+		return fmt.Errorf("There was an error when setting up the %s mibDB database and the %s profiles: %v.", conf.Global.MibDB, conf.Global.MibProfileDir, err)
 	}
 	defer mdb.Close()
 
@@ -129,7 +129,7 @@ func doubleCheckHost(result scan.Result, timeout time.Duration, ctl chan bool, m
 		}
 		serv, err := snmp_util.InitSNMP(&device, timeout, conf.Global.Retries, posit, log)
 		if err != nil {
-			log.Warnf("Init Issue starting SNMP interface component -- %v", err)
+			log.Warnf("There was an error when starting SNMP interface component -- %v.", err)
 			return
 		}
 		md, err = metadata.GetDeviceMetadata(log, serv, nil)
@@ -151,7 +151,7 @@ func doubleCheckHost(result scan.Result, timeout time.Duration, ctl chan bool, m
 			}
 			serv, err := snmp_util.InitSNMP(&device, timeout, conf.Global.Retries, posit, log)
 			if err != nil {
-				log.Warnf("Init Issue starting SNMP interface component -- %v", err)
+				log.Warnf("There was an error when starting SNMP interface component -- %v.", err)
 				return
 			}
 			md, err = metadata.GetDeviceMetadata(log, serv, nil)
@@ -196,7 +196,7 @@ func doubleCheckHost(result scan.Result, timeout time.Duration, ctl chan bool, m
 	// TODO, actually store this mibs.
 	mibs, provider, first, err := mdb.GetForOidRecur(md.SysObjectID, device.MibProfile, device.Description)
 	if err != nil {
-		log.Warnf("Issue loading mibs: %v", err)
+		log.Warnf("There was an error when loading the mibs: %v.", err)
 	} else {
 		if first && conf.Disco.AddFromMibDB {
 			device.DeviceOids = mibs
diff --git a/pkg/inputs/snmp/metadata/interface_metadata.go b/pkg/inputs/snmp/metadata/interface_metadata.go
index 6d4279d..b4c7189 100644
--- a/pkg/inputs/snmp/metadata/interface_metadata.go
+++ b/pkg/inputs/snmp/metadata/interface_metadata.go
@@ -213,12 +213,12 @@ func (im *InterfaceMetadata) Poll(ctx context.Context, conf *kt.SnmpDeviceConfig
 				// index is two integer elements -- first is ifIndex of the "higher" layer, second is ifIndex of the "lower" layer
 				index := strings.Split(oidIdx, ".")
 				if len(index) != 2 {
-					im.log.Warnf("incorrectly-indexed ifStackStatus instance: %s -> %v", variable.Name, variable.Value)
+					im.log.Warnf("You used an unsupported value for the %s ifStackStatus variable: %v.", variable.Name, variable.Value)
 					continue
 				}
 				val := gosnmp.ToBigInt(variable.Value).Uint64()
 				if val != 1 && val != 2 {
-					im.log.Warnf("bad ifStackStatus value: %s -> %v", variable.Name, variable.Value)
+					im.log.Warnf("You used an unsupported value for the %s ifStackStatus instance: %v.", variable.Name, variable.Value)
 					continue
 				}
 
@@ -234,7 +234,7 @@ func (im *InterfaceMetadata) Poll(ctx context.Context, conf *kt.SnmpDeviceConfig
 				// recent TimeFilter value.
 				index := strings.Split(oidIdx, ".")
 				if len(index) != 3 {
-					im.log.Warnf("incorrectly-indexed lldpRemTable instance: %s -> %v", variable.Name, variable.Value)
+					im.log.Warnf("You used an unsupported value for the %s lldpRemTable variable: %v.", variable.Name, variable.Value)
 					continue
 				}
 
@@ -243,14 +243,14 @@ func (im *InterfaceMetadata) Poll(ctx context.Context, conf *kt.SnmpDeviceConfig
 					switch oidName {
 					case SNMP_lldpRemPortIdSubtype:
 						if variable.Type != gosnmp.Integer {
-							im.log.Warnf("unexpected type on lldpRemPortIdSubtype %v %v %v", variable.Name, variable.Type, variable.Value)
+							im.log.Warnf("You used an unsupported type for the %v variable: %v.", variable.Name, variable.Type, variable.Value)
 							break
 						}
 						data.ExtraInfo[oidName] = strconv.Itoa(int(gosnmp.ToBigInt(variable.Value).Uint64()))
 
 					case SNMP_lldpRemPortId:
 						if variable.Type != gosnmp.OctetString {
-							im.log.Warnf("unexpected type on lldpRemPortId %v %v %v", variable.Name, variable.Type, variable.Value)
+							im.log.Warnf("You used an unsupported type for the %v variable: %v.", variable.Name, variable.Type, variable.Value)
 							break
 						}
 						value := variable.Value.([]byte)
@@ -278,12 +278,12 @@ func (im *InterfaceMetadata) Poll(ctx context.Context, conf *kt.SnmpDeviceConfig
 							// the ifIndex of the interface we're connected to.  Just save it.
 							data.ExtraInfo[oidName] = string(value)
 						default:
-							im.log.Warnf("unexpected subtype for lldpRemPortId: %v %v %v %v", variable.Name, variable.Type, variable.Value, data.ExtraInfo[SNMP_lldpRemPortIdSubtype])
+							im.log.Warnf("You used an unexpected subtype for lldpRemPortId: %v %v %v %v.", variable.Name, variable.Type, variable.Value, data.ExtraInfo[SNMP_lldpRemPortIdSubtype])
 						}
 
 					case SNMP_lldpRemPortDesc, SNMP_lldpRemSysName:
 						if variable.Type != gosnmp.OctetString {
-							im.log.Warnf("unexpected type on %s %v %v %v", oidName, variable.Name, variable.Type, variable.Value)
+							im.log.Warnf("You used an unsupported type for the %s %v %v %v variable.", oidName, variable.Name, variable.Type, variable.Value)
 							break
 						}
 						data.ExtraInfo[oidName] = string(variable.Value.([]byte))
diff --git a/pkg/inputs/snmp/metadata/poll.go b/pkg/inputs/snmp/metadata/poll.go
index 106184b..b814487 100644
--- a/pkg/inputs/snmp/metadata/poll.go
+++ b/pkg/inputs/snmp/metadata/poll.go
@@ -92,7 +92,7 @@ func (p *Poller) StartLoop(ctx context.Context) {
 		p.log.Infof("Start: Polling SNMP Interface")
 		deviceDataNew, err := p.PollSNMPMetadata(ctx)
 		if err != nil {
-			p.log.Warnf("Issue polling SNMP Interface: %v", err)
+			p.log.Warnf("There was an error when polling for SNMP devices: %v.", err)
 			p.metrics.Errors.Mark(1)
 			return
 		}
@@ -101,7 +101,7 @@ func (p *Poller) StartLoop(ctx context.Context) {
 		flows, err := p.toFlows(deviceDataNew)
 		if err != nil {
 			p.metrics.Errors.Mark(1)
-			p.log.Warnf("Issue converting metadata: %v", err)
+			p.log.Warnf("There was an error when converting the metadata: %v.", err)
 			return
 		}
 		p.metrics.Metadata.Mark(1)
@@ -132,7 +132,7 @@ func (p *Poller) PollSNMPMetadata(ctx context.Context) (*kt.DeviceData, error) {
 
 	// If there's no interfaces, note this this might be an issue for some devices but keep on going.
 	if len(intLine) == 0 {
-		p.log.Warnf("SNMP: issue polling metadata: zero interfaces found")
+		p.log.Warnf("No SNMP devices were found when polling the metadata.")
 	}
 
 	deviceData := &kt.DeviceData{
diff --git a/pkg/inputs/snmp/metrics/poll.go b/pkg/inputs/snmp/metrics/poll.go
index 2aa1119..4187e28 100644
--- a/pkg/inputs/snmp/metrics/poll.go
+++ b/pkg/inputs/snmp/metrics/poll.go
@@ -95,7 +95,7 @@ func (p *Poller) StartLoop(ctx context.Context) {
 
 				flows, err := p.Poll(ctx)
 				if err != nil {
-					p.log.Warnf("Issue polling SNMP Counter: %v", err)
+					p.log.Warnf("There was an error when polling the SNMP counter: %v.", err)
 
 					// We didn't collect all the metrics here, which means that our delta values are
 					// off, and we have to discard them.
diff --git a/pkg/inputs/snmp/mibs/load.go b/pkg/inputs/snmp/mibs/load.go
index 21bb675..f089c22 100644
--- a/pkg/inputs/snmp/mibs/load.go
+++ b/pkg/inputs/snmp/mibs/load.go
@@ -183,6 +183,9 @@ func (db *MibDB) checkForProvider(name string, profile string, description strin
 	profile = strings.ToLower(profile)
 
 	combo := name + "^" + description
+	if strings.Contains(profile, "base.yml") {
+		return kt.ProviderDefault, true
+	}
 	if !strings.Contains(profile, "cisco-catalyst") && (strings.Contains(combo, "router") || strings.Contains(combo, "ios xr") ||
 		strings.Contains(combo, "freebsd") || strings.Contains(profile, "cisco-asr")) {
 		return kt.ProviderRouter, true
@@ -193,9 +196,6 @@ func (db *MibDB) checkForProvider(name string, profile string, description strin
 	if strings.Contains(combo, "firewall") {
 		return kt.ProviderFirewall, true
 	}
-	if strings.Contains(profile, "base.yml") {
-		return kt.ProviderDefault, true
-	}
 	if strings.Contains(profile, "ups") {
 		return kt.ProviderUPS, true
 	}
diff --git a/pkg/inputs/snmp/mibs/profile.go b/pkg/inputs/snmp/mibs/profile.go
index 3ad832b..31d3154 100644
--- a/pkg/inputs/snmp/mibs/profile.go
+++ b/pkg/inputs/snmp/mibs/profile.go
@@ -62,13 +62,13 @@ func (p *Profile) extend(extends map[string]*Profile) error {
 
 	for _, name := range p.Extends {
 		if ep, ok := extends[name]; !ok {
-			p.Errorf("Missing extended profile %s", name)
+			p.Errorf("You must set the %s extended profile.", name)
 			continue
 		} else {
 			// Verify this guy is extended.
 			err := ep.extend(extends) // recursive, watch out.
 			if err != nil {
-				p.Errorf("Cannot extend profile %s %v", name, err)
+				p.Errorf("There was an error when extending the %s profile: %v.", name, err)
 				continue
 			}
 
@@ -123,14 +123,14 @@ func (mdb *MibDB) loadProfileDir(profileDir string, extends map[string]*Profile)
 		// Now, recurse down if this file actually a directory
 		info, err := os.Stat(fname)
 		if err != nil {
-			mdb.log.Errorf("Cannot stat dir %s", fname)
+			mdb.log.Errorf("There was an error with the %s folder.", fname)
 			continue
 		}
 		if info.IsDir() {
 			mdb.log.Infof("Recursing into %s", fname)
 			err := mdb.loadProfileDir(fname, extends)
 			if err != nil {
-				mdb.log.Errorf("Cannot recurse into directory %s", fname)
+				mdb.log.Errorf("There was an error when accessing the following folder: %s: %v.", fname)
 				continue
 			}
 		}
@@ -140,12 +140,12 @@ func (mdb *MibDB) loadProfileDir(profileDir string, extends map[string]*Profile)
 		case "xml":
 			err := mdb.parseMibFromXml(fname)
 			if err != nil {
-				mdb.log.Errorf("Cannot parse XML mib %s %v", fname, err)
+				mdb.log.Errorf("There was an error when parsing the %s XML mib: %v.", fname, err)
 			}
 		case "yaml", "yml":
 			err := mdb.parseMibFromYml(fname, file, extends)
 			if err != nil {
-				mdb.log.Errorf("Cannot parse Yaml mib %s %v", fname, err)
+				mdb.log.Errorf("There was an error when parsing the %s YAML mib: %v.", fname, err)
 			}
 		default:
 			if len(pts) > 1 {
@@ -184,16 +184,16 @@ func (p *Profile) validate() error {
 	hasErr := false
 	for _, metric := range p.Metrics {
 		if metric.Symbol.Oid == "" && len(metric.Symbols) == 0 {
-			p.Warnf("Possibly corrupted table? %s %s %v", p.From, metric.Mib, metric)
+			p.Warnf("There was an error in a table: %s %s %v.", p.From, metric.Mib, metric)
 			hasErr = true
 		}
 		if metric.Symbol.Oid != "" && metric.Symbol.Name == "" {
-			p.Warnf("Possibly corrupted symbol oid? %s %s %v", p.From, metric.Mib, metric.Symbol.Oid)
+			p.Warnf("You used an unsupported symbol for oid: %s %s %v.", p.From, metric.Mib, metric.Symbol.Oid)
 			hasErr = true
 		}
 		for _, s := range metric.Symbols {
 			if s.Oid != "" && s.Name == "" {
-				p.Warnf("Possibly corrupted symbols oid? %s %s %v", p.From, metric.Mib, s.Oid)
+				p.Warnf("You used unsupported symbols for oid: %s %s %v.", p.From, metric.Mib, s.Oid)
 				hasErr = true
 			}
 		}
@@ -201,11 +201,11 @@ func (p *Profile) validate() error {
 
 	for _, tag := range p.MetricTags {
 		if tag.Column.Oid == "" {
-			p.Warnf("Possibly corrupted metadata table? %s %v", p.From, tag)
+			p.Warnf("There was an error in a metadata table: %s %v.", p.From, tag)
 			hasErr = true
 		}
 		if tag.Column.Oid != "" && tag.Column.Name == "" {
-			p.Warnf("Possibly corrupted metadata table? %s %v", p.From, tag)
+			p.Warnf("There was an error in a metadata table: %s %v.", p.From, tag)
 			hasErr = true
 		}
 	}
@@ -213,7 +213,7 @@ func (p *Profile) validate() error {
 	for _, metric := range p.Metrics {
 		for _, tag := range metric.MetricTags {
 			if tag.Column.Oid != "" && tag.Column.Name == "" {
-				p.Warnf("Possibly corrupted metadata table? %s %v", p.From, tag)
+				p.Warnf("There was an error in a metadata table: %s %v.", p.From, tag)
 				hasErr = true
 			}
 		}
diff --git a/pkg/inputs/snmp/mibs/pymib.go b/pkg/inputs/snmp/mibs/pymib.go
index 71410ad..cd22a42 100644
--- a/pkg/inputs/snmp/mibs/pymib.go
+++ b/pkg/inputs/snmp/mibs/pymib.go
@@ -182,13 +182,13 @@ func ConvertJson2Yaml(file string, log logger.ContextL) error {
 func loadJson(fname string, log logger.ContextL) (*PySMIMibFile, error) {
 	data, err := os.ReadFile(fname)
 	if err != nil {
-		return nil, fmt.Errorf("Cannot read file %s %v", fname, err)
+		return nil, fmt.Errorf("There was an error when accessing the %s file: %v.", fname, err)
 	}
 
 	pmib := PySMIMibFile{}
 	err = json.Unmarshal(data, &pmib)
 	if err != nil {
-		return nil, fmt.Errorf("Cannot unmarshal file %s", fname)
+		return nil, fmt.Errorf("There was an error when unmarshalling the %s file: %v.", fname, err)
 	}
 
 	return &pmib, nil
@@ -212,13 +212,13 @@ func (mdb *MibDB) LoadPyMibSet(profileDir string) (int, error) {
 		if file.Name() == SysidMap { // Special file which maps loads mids to sysoid markers.
 			data, err := os.ReadFile(fname)
 			if err != nil {
-				mdb.log.Errorf("Cannot read file %s %v", fname, err)
+				mdb.log.Errorf("There was an error when accessing the %s file: %v.", fname, err)
 				continue
 			}
 
 			err = json.Unmarshal(data, &psysmap)
 			if err != nil {
-				mdb.log.Errorf("Cannot unmarshal sysmap file %s %v", fname, err)
+				mdb.log.Errorf("There was an error when marshalling the %s sysmap file: %v.", fname, err)
 			}
 			continue
 		} else {
diff --git a/pkg/inputs/snmp/snmp.go b/pkg/inputs/snmp/snmp.go
index c45b40e..d28bfec 100644
--- a/pkg/inputs/snmp/snmp.go
+++ b/pkg/inputs/snmp/snmp.go
@@ -26,7 +26,7 @@ import (
 var (
 	mibdb          *mibs.MibDB // Global singleton instance here.
 	dumpMibTable   = flag.Bool("snmp_dump_mibs", false, "If true, dump the list of possible mibs on start.")
-	flowOnly       = flag.Bool("snmp_flow_only", false, "If true, don't poll snmp devices.")
+	flowOnly       = flag.Bool("flow_only", false, "If true, don't poll snmp devices.")
 	jsonToYaml     = flag.String("snmp_json2yaml", "", "If set, convert the passed in json file to a yaml profile.")
 	snmpWalk       = flag.String("snmp_do_walk", "", "If set, try to perform a snmp walk against the targeted device.")
 	snmpWalkOid    = flag.String("snmp_walk_oid", ".1.3.6.1", "Walk this oid if -snmp_do_walk is set.")
@@ -52,7 +52,7 @@ func StartSNMPPolls(ctx context.Context, snmpFile string, jchfChan chan []*kt.JC
 	if conf.Global != nil {
 		mdb, err := mibs.NewMibDB(conf.Global.MibDB, conf.Global.MibProfileDir, log)
 		if err != nil {
-			return fmt.Errorf("Cannot set up mibDB -- db: %s, profiles: %s -> %v", conf.Global.MibDB, conf.Global.MibProfileDir, err)
+			return fmt.Errorf("There was an error when setting up the %s mibDB database and the %s profiles: %v.", conf.Global.MibDB, conf.Global.MibProfileDir, err)
 		}
 		mibdb = mdb
 	} else {
@@ -113,7 +113,7 @@ func wrapSnmpPolling(ctx context.Context, snmpFile string, jchfChan chan []*kt.J
 	ctxSnmp, cancel := context.WithCancel(ctx)
 	err := runSnmpPolling(ctxSnmp, snmpFile, jchfChan, metrics, registry, apic, log)
 	if err != nil {
-		log.Errorf("Error running snmp polling: %v", err)
+		log.Errorf("There was an error when polling for SNMP devices: %v.", err)
 	}
 
 	// Now, wait for sigusr2 to re-do.
@@ -199,13 +199,13 @@ func launchSnmp(ctx context.Context, conf *kt.SnmpGlobalConfig, device *kt.SnmpD
 	// like maintaining separate GoSNMP structs for the two goroutines is safe.
 	metadataServer, err := snmp_util.InitSNMP(device, connectTimeout, retries, "", log)
 	if err != nil {
-		log.Warnf("Init Issue starting SNMP interface component -- %v", err)
+		log.Warnf("There was an error when starting SNMP interface component -- %v.", err)
 		metrics.Fail.Update(kt.SNMP_BAD)
 		return err
 	}
 	metricsServer, err := snmp_util.InitSNMP(device, connectTimeout, retries, "", log)
 	if err != nil {
-		log.Warnf("Init Issue starting SNMP interface component -- %v", err)
+		log.Warnf("There was an error when starting SNMP interface component -- %v.", err)
 		metrics.Fail.Update(kt.SNMP_BAD)
 		return err
 	}
@@ -225,7 +225,7 @@ func launchSnmp(ctx context.Context, conf *kt.SnmpGlobalConfig, device *kt.SnmpD
 		_, err := metricPoller.Poll(ctx)
 		if err != nil {
 			metrics.Fail.Update(kt.SNMP_BAD)
-			log.Warnf("Init Issue polling SNMP counters: %v", err)
+			log.Warnf("There was an error when polling the SNMP counters: %v.", err)
 		}
 
 		// Having done that, we'll launch additional, separate goroutines for
diff --git a/pkg/inputs/snmp/util/adaptor.go b/pkg/inputs/snmp/util/adaptor.go
index b383cce..4f85c94 100644
--- a/pkg/inputs/snmp/util/adaptor.go
+++ b/pkg/inputs/snmp/util/adaptor.go
@@ -156,7 +156,7 @@ func InitSNMP(device *kt.SnmpDeviceConfig, connectTimeout time.Duration, retries
 			return nil, err
 		}
 
-		log.Warnf("Could not connect to SNMP -- take %d", times)
+		log.Warnf("It was not possible to connect to the SNMP devices after %d times.", times)
 		time.Sleep(SNMP_POLL_SLEEP_TIME)
 		times++
 	}
diff --git a/pkg/inputs/snmp/util/util.go b/pkg/inputs/snmp/util/util.go
index 2f82d38..6907e9b 100644
--- a/pkg/inputs/snmp/util/util.go
+++ b/pkg/inputs/snmp/util/util.go
@@ -127,10 +127,10 @@ func WalkOID(ctx context.Context, device *kt.SnmpDeviceConfig, oid string, serve
 			return results, nil
 		}
 
-		log.Warnf("%s SNMP retry %d, poll error '%v' walking OID %s", logName, i, err, oid)
+		log.Warnf("There was an SNMP polling error with the %s walking OID after %d retries:%v.", logName, i, err, oid)
 	}
 
-	log.Warnf("%s SNMP retry on OID %s failed - giving up", logName, oid)
+	log.Warnf("There was an error with the %s OID in the SNMP retry: %s.", logName, oid)
 	return nil, err
 }
 
@@ -191,7 +191,7 @@ func PrettyPrint(pdu gosnmp.SnmpPDU, format string, log logger.ContextL) string
 func DoWalk(device string, baseOid string, format string, conf *kt.SnmpConfig, connectTimeout time.Duration, retries int, log logger.ContextL) error {
 	dconf := conf.Devices[device]
 	if dconf == nil {
-		return fmt.Errorf("No such device found in snmp config: %s", device)
+		return fmt.Errorf("The %s device was not found in the SNMP configuration file.", device)
 	}
 
 	server, err := InitSNMP(dconf, connectTimeout, retries, "", log)
diff --git a/pkg/inputs/vpc/aws/entity_fetch.go b/pkg/inputs/vpc/aws/entity_fetch.go
index 454e0c9..bcb2e8b 100644
--- a/pkg/inputs/vpc/aws/entity_fetch.go
+++ b/pkg/inputs/vpc/aws/entity_fetch.go
@@ -306,7 +306,7 @@ func fetchVpcs(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTopology, regi
 		return true
 	})
 	if err != nil {
-		return fmt.Errorf("Error fetching Vpcs: %s", err)
+		return fmt.Errorf("There was an error when fetching VPCS: %s.", err)
 	}
 	return nil
 }
@@ -314,7 +314,7 @@ func fetchVpcs(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTopology, regi
 func fetchAvailabilityZones(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTopology, regionName string, sleepTime time.Duration) error {
 	out, err := ec2cli.DescribeAvailabilityZonesWithContext(ctx, &ec2.DescribeAvailabilityZonesInput{})
 	if err != nil {
-		return fmt.Errorf("Error fetching availability zones: %s", err)
+		return fmt.Errorf("There was an error when fetching availability zones: %s.", err)
 	}
 	for _, az := range out.AvailabilityZones {
 		if az == nil || az.ZoneId == nil {
@@ -360,7 +360,7 @@ func fetchSubnets(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTopology, r
 			return true
 		})
 	if err != nil {
-		return fmt.Errorf("Error fetching subnets: %s", err)
+		return fmt.Errorf("There was an error when fetching subnets: %s.", err)
 	}
 	return nil
 }
@@ -399,7 +399,7 @@ func fetchInternetGateways(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTo
 			return true
 		})
 	if err != nil {
-		return fmt.Errorf("Error fetching internet gateways: %s", err)
+		return fmt.Errorf("There was an error when fetching internet gateways: %s.", err)
 	}
 	return nil
 }
@@ -430,7 +430,7 @@ func fetchNATGateways(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTopolog
 			return true
 		})
 	if err != nil {
-		return fmt.Errorf("Error fetching NAT gateways: %s", err)
+		return fmt.Errorf("There was an error when fetching NAT gateways: %s.", err)
 	}
 	return nil
 }
@@ -450,7 +450,7 @@ func fetchTransitGateways(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTop
 			return true
 		})
 	if err != nil {
-		return fmt.Errorf("Error fetching transit gateways: %s", err)
+		return fmt.Errorf("There was an error when fetching transit gateways: %s.", err)
 	}
 	return nil
 }
@@ -491,7 +491,7 @@ func fetchTransitGatewayAttachments(ctx context.Context, ec2cli *ec2.EC2, topolo
 			return true
 		})
 	if err != nil {
-		return fmt.Errorf("Error fetching transit gateway attachments: %s", err)
+		return fmt.Errorf("There was an error when fetching transit gateways attachments: %s.", err)
 	}
 	return nil
 }
@@ -499,7 +499,7 @@ func fetchTransitGatewayAttachments(ctx context.Context, ec2cli *ec2.EC2, topolo
 func fetchVPNGateways(ctx context.Context, ec2cli *ec2.EC2, topology *AWSTopology, regionName string, sleepTime time.Duration) error {
 	output, err := ec2cli.DescribeVpnGatewaysWithContext(ctx, &ec2.DescribeVpnGatewaysInput{})
 	if err != nil {
-		return fmt.Errorf("Error fetching VPN gateways: %s", err)
+		return fmt.Errorf("There was an error when fetching VPN gateways: %s.", err)
 	}
 
 	for _, gw := range output.VpnGateways {
@@ -534,7 +534,7 @@ func fetchVpcPeeringConnections(ctx context.Context, ec2cli *ec2.EC2, topology *
 		return true
 	})
 	if err != nil {
-		return fmt.Errorf("Error fetching VPC peering connections gateways: %s", err)
+		return fmt.Errorf("There was an error when fetching VPC peering connections gateways: %s.", err)
 	}
 	return nil
 }
diff --git a/pkg/inputs/vpc/aws/mapping.go b/pkg/inputs/vpc/aws/mapping.go
index 9e1717e..dc5a847 100644
--- a/pkg/inputs/vpc/aws/mapping.go
+++ b/pkg/inputs/vpc/aws/mapping.go
@@ -38,7 +38,7 @@ func (vpc *AwsVpc) updateMapping(ctx context.Context) error {
 
 	topo, allGood := FetchAllEntities(ctx, vpc, *IamRole, vpc.regions)
 	if !allGood {
-		vpc.Warnf("Failed to fetch some mappings")
+		vpc.Warnf("There was an error when fetching mappings.")
 	}
 
 	// And if good, update our mapping set.
diff --git a/pkg/inputs/vpc/aws/s3.go b/pkg/inputs/vpc/aws/s3.go
index 6234581..a20cc64 100644
--- a/pkg/inputs/vpc/aws/s3.go
+++ b/pkg/inputs/vpc/aws/s3.go
@@ -82,11 +82,11 @@ func (vpc *AwsVpc) processObject(bucket string, mdata *s3.Object) error {
 					}
 				}
 				if err := scanner.Err(); err != nil {
-					vpc.Warnf("cannot scan clear %s %s: %v", bucket, *mdata.Key, err)
+					vpc.Warnf("Could not scan %s %s: %v.", bucket, *mdata.Key, err)
 					return err
 				}
 			} else { // Can't un-gzip here.
-				vpc.Warnf("cannot gz %s %s: %v", bucket, *mdata.Key, err)
+				vpc.Warnf("Could not gz %s %s: %v.", bucket, *mdata.Key, err)
 				return err
 			}
 		} else {
@@ -114,11 +114,11 @@ func (vpc *AwsVpc) processObject(bucket string, mdata *s3.Object) error {
 				}
 			}
 			if err := scanner.Err(); err != nil {
-				vpc.Warnf("cannot scan %s %s: %v", bucket, *mdata.Key, err)
+				vpc.Warnf("Could not close %s %s: %v.", bucket, *mdata.Key, err)
 				return err
 			}
 			if err := zr.Close(); err != nil {
-				vpc.Warnf("cannot close zr %s %s: %v", bucket, *mdata.Key, err)
+				vpc.Warnf("Could not close zr %s %s: %v.", bucket, *mdata.Key, err)
 				return err
 			}
 		}
@@ -132,7 +132,7 @@ func (vpc *AwsVpc) processObject(bucket string, mdata *s3.Object) error {
 		// Pull out all the info we can from the key path.
 		err := record.ProcessKey(bucket, *mdata.Key)
 		if err != nil {
-			vpc.Warnf("cannot process %s %s: %v", bucket, *mdata.Key, err)
+			vpc.Warnf("Could not process %s %s: %v.", bucket, *mdata.Key, err)
 			return err
 		}
 
@@ -144,7 +144,7 @@ func (vpc *AwsVpc) processObject(bucket string, mdata *s3.Object) error {
 			vpc.metrics.DroppedFlows.Mark(int64(len(record.Lines)))
 		}
 	} else {
-		vpc.Warnf("No flows found for %s %s", bucket, *mdata.Key)
+		vpc.Warnf("No flow data devices found for %s %s.", bucket, *mdata.Key)
 	}
 
 	return nil
diff --git a/pkg/inputs/vpc/vpc.go b/pkg/inputs/vpc/vpc.go
index ef43935..24074e6 100644
--- a/pkg/inputs/vpc/vpc.go
+++ b/pkg/inputs/vpc/vpc.go
@@ -34,7 +34,7 @@ func NewVpc(ctx context.Context, cloud CloudSource, log logger.Underlying, regis
 	case Gcp:
 		return gcp.NewVpc(ctx, log, registry, jchfChan, apic, maxBatchSize)
 	case Azure:
-		return nil, fmt.Errorf("Unimplemented vpc %v", cloud)
+		return nil, fmt.Errorf("Azure is not yet supported as a VPC: %v.", cloud)
 	}
-	return nil, fmt.Errorf("Unknown vpc %v", cloud)
+	return nil, fmt.Errorf("You used an unsupported VPC: %v.", cloud)
 }
diff --git a/pkg/sinks/ddog/ddog.go b/pkg/sinks/ddog/ddog.go
index 82c0df4..8ca9ca5 100644
--- a/pkg/sinks/ddog/ddog.go
+++ b/pkg/sinks/ddog/ddog.go
@@ -72,7 +72,7 @@ func (s *DDogSink) Init(ctx context.Context, format formats.Format, compression
 	// Fill in some values from envs.
 	apiKey := os.Getenv(DD_API_KEY)
 	if apiKey == "" {
-		return fmt.Errorf("Missing env var %s", DD_API_KEY)
+		return fmt.Errorf("The %s environment variable is not set in your machine.", DD_API_KEY)
 	}
 	s.headers["DD-API-KEY"] = apiKey
 
@@ -101,7 +101,7 @@ func (s *DDogSink) HttpInfo() map[string]float64 {
 func (s *DDogSink) sendHttp(ctx context.Context, payload []byte) {
 	req, err := http.NewRequestWithContext(ctx, "POST", s.TargetUrl, bytes.NewBuffer(payload))
 	if err != nil {
-		s.Errorf("Cannot create HTTP request: %v", err)
+		s.Errorf("There was an error when creating an HTTP request: %v.", err)
 		return
 	}
 
@@ -111,17 +111,17 @@ func (s *DDogSink) sendHttp(ctx context.Context, payload []byte) {
 
 	resp, err := s.client.Do(req)
 	if err != nil {
-		s.Errorf("Cannot write to DDOG: %v, creating new client", err)
+		s.Errorf("There was an error when writing to DDOG: %v.", err)
 		s.client = &http.Client{Transport: s.tr}
 	} else {
 		defer resp.Body.Close()
 		bdy, err := ioutil.ReadAll(resp.Body)
 		if err != nil {
-			s.Errorf("Cannot get resp body from DDOG: %v", err)
+			s.Errorf("There was an error when communitacting with DDOG: %v.", err)
 			s.metrics.DeliveryErr.Mark(1)
 		} else {
 			if resp.StatusCode >= 400 {
-				s.Errorf("Cannot write to DDOG, status code %d, bdy: %s", resp.StatusCode, string(bdy))
+				s.Errorf("There was an error when communitacting with DDOG: %d. Body: %s.", resp.StatusCode, string(bdy))
 				s.metrics.DeliveryErr.Mark(1)
 			} else {
 				s.metrics.DeliveryWin.Mark(1)
diff --git a/pkg/sinks/file/file.go b/pkg/sinks/file/file.go
index 0c01cce..a1e3ae5 100644
--- a/pkg/sinks/file/file.go
+++ b/pkg/sinks/file/file.go
@@ -80,7 +80,7 @@ func (s *FileSink) Init(ctx context.Context, format formats.Format, compression
 						name := s.getName()
 						f, err := os.Create(name)
 						if err != nil {
-							s.Errorf("Cannot create file %s -> %v", name, err)
+							s.Errorf("There was an error when creating the %s file: %v.", name, err)
 						} else {
 							s.fd = f
 						}
@@ -101,7 +101,7 @@ func (s *FileSink) Init(ctx context.Context, format formats.Format, compression
 				name := s.getName()
 				f, err := os.Create(name)
 				if err != nil {
-					s.Errorf("Cannot create file %s -> %v", name, err)
+					s.Errorf("There was an error when creating the %s file: %v.", name, err)
 					s.fd = nil
 				} else {
 					s.fd = f
diff --git a/pkg/sinks/gcloud/gcloud.go b/pkg/sinks/gcloud/gcloud.go
index 0225f6e..49c5247 100644
--- a/pkg/sinks/gcloud/gcloud.go
+++ b/pkg/sinks/gcloud/gcloud.go
@@ -52,11 +52,11 @@ func NewSink(log logger.Underlying, registry go_metrics.Registry) (*GCloudSink,
 func (s *GCloudSink) Init(ctx context.Context, format formats.Format, compression kt.Compression, fmtr formats.Formatter) error {
 	rand.Seed(time.Now().UnixNano())
 	if s.Bucket == "" {
-		return fmt.Errorf("Not writing to gcloud -- no bucket set, use -gcloud_bucket flag")
+		return fmt.Errorf("No bucket was set for gcloud. Use the -gcloud_bucket option to set one up.")
 	}
 	client, err := storage.NewClient(ctx)
 	if err != nil {
-		return fmt.Errorf("Cannot create gcloud client -- %v", err)
+		return fmt.Errorf("There was an error when creating the gcloud client: %v.", err)
 	}
 	s.client = client
 
@@ -73,11 +73,11 @@ func (s *GCloudSink) send(ctx context.Context, payload []byte) {
 	wc := s.client.Bucket(s.Bucket).Object(fmt.Sprintf("%s/%d_%d", s.prefix, time.Now().Unix(), rand.Intn(100000))).NewWriter(ctx)
 	wc.ContentType = s.contentType
 	if _, err := wc.Write(payload); err != nil {
-		s.Errorf("Cannot upload to gcloud: %v", err)
+		s.Errorf("There was an error when uploading to gcloud: %v.", err)
 		s.metrics.DeliveryErr.Mark(1)
 	}
 	if err := wc.Close(); err != nil {
-		s.Errorf("Cannot close upload to gcloud: %v", err)
+		s.Errorf("There was an error when uploading to gcloud: %v.", err)
 		s.metrics.DeliveryErr.Mark(1)
 	}
 	s.metrics.DeliveryWin.Mark(1)
diff --git a/pkg/sinks/http/http.go b/pkg/sinks/http/http.go
index 79f2f28..9e6c6b6 100644
--- a/pkg/sinks/http/http.go
+++ b/pkg/sinks/http/http.go
@@ -64,7 +64,7 @@ func NewSink(log logger.Underlying, registry go_metrics.Registry, sink string) (
 		if len(pts) > 1 {
 			nr.headers[strings.TrimSpace(pts[0])] = strings.TrimSpace(pts[1])
 		} else {
-			return nil, fmt.Errorf("Invalid header: %s", header)
+			return nil, fmt.Errorf("The %s header contains unsupported content.", header)
 		}
 	}
 
@@ -114,7 +114,7 @@ func (s *HttpSink) HttpInfo() map[string]float64 {
 func (s *HttpSink) sendHttp(ctx context.Context, payload []byte) {
 	req, err := http.NewRequestWithContext(ctx, "POST", s.TargetUrl, bytes.NewBuffer(payload))
 	if err != nil {
-		s.Errorf("Cannot create HTTP request: %v", err)
+		s.Errorf("There was an error when creating an HTTP request: %v.", err)
 		return
 	}
 
@@ -124,17 +124,17 @@ func (s *HttpSink) sendHttp(ctx context.Context, payload []byte) {
 
 	resp, err := s.client.Do(req)
 	if err != nil {
-		s.Errorf("Cannot write to HTTP: %v, creating new client", err)
+		s.Errorf("There was an error when converting to HTTP: %v.", err)
 		s.client = &http.Client{Transport: s.tr}
 	} else {
 		defer resp.Body.Close()
 		bdy, err := ioutil.ReadAll(resp.Body)
 		if err != nil {
-			s.Errorf("Cannot get resp body from HTTP: %v", err)
+			s.Errorf("There was an error when getting the HTTP response body: %v.", err)
 			s.metrics.DeliveryErr.Mark(1)
 		} else {
 			if resp.StatusCode >= 400 {
-				s.Errorf("Cannot write to HTTP, status code %d, bdy: %s", resp.StatusCode, string(bdy))
+				s.Errorf("There was an error when converting to HTTP: %d. Body: %s.", resp.StatusCode, string(bdy))
 				s.metrics.DeliveryErr.Mark(1)
 			} else {
 				s.metrics.DeliveryWin.Mark(1)
diff --git a/pkg/sinks/kafka/kafa.go b/pkg/sinks/kafka/kafa.go
index d7393f3..196b31f 100644
--- a/pkg/sinks/kafka/kafa.go
+++ b/pkg/sinks/kafka/kafa.go
@@ -69,7 +69,7 @@ func (s *KafkaSink) Send(ctx context.Context, payload *kt.Output) {
 		Value: payload.Body,
 	})
 	if err != nil {
-		s.Errorf("Delivery failed: %v\n", err)
+		s.Errorf("There was an error with the delivery: %v.", err)
 		s.metrics.DeliveryErr.Mark(1)
 	} else {
 		s.metrics.DeliveryWin.Mark(1)
diff --git a/pkg/sinks/net/net.go b/pkg/sinks/net/net.go
index 9e0b537..1b98279 100644
--- a/pkg/sinks/net/net.go
+++ b/pkg/sinks/net/net.go
@@ -76,7 +76,7 @@ func (s *NetSink) Init(ctx context.Context, format formats.Format, compression k
 func (s *NetSink) Send(ctx context.Context, payload *kt.Output) {
 	_, err := s.conn.Write(payload.Body)
 	if err != nil {
-		s.Errorf("Cannot write: %v", err)
+		s.Errorf("There was an error when writing: %v.", err)
 		s.metrics.DeliveryErr.Mark(1)
 	} else {
 		s.metrics.DeliveryWin.Mark(1)
diff --git a/pkg/sinks/nr/nr.go b/pkg/sinks/nr/nr.go
index d86954c..383a054 100644
--- a/pkg/sinks/nr/nr.go
+++ b/pkg/sinks/nr/nr.go
@@ -116,7 +116,7 @@ func (s *NRSink) Init(ctx context.Context, format formats.Format, compression kt
 		*NrMetricsUrl = regions[rval]["metrics"]
 		s.NRUrlLog = regions[rval]["logs"]
 	default:
-		return fmt.Errorf("Invalid NR region %s. Current regions: EU|US", *NrRegion)
+		return fmt.Errorf("You used an unsupported New Relic One region: %s. The possible values are EU or US.", *NrRegion)
 	}
 
 	s.NRAccount = *NrAccount
@@ -140,13 +140,13 @@ func (s *NRSink) Init(ctx context.Context, format formats.Format, compression kt
 	s.client = &http.Client{Transport: s.tr}
 
 	if s.NRAccount == "" || s.NRApiKey == "" {
-		return fmt.Errorf("New Relic requires -nr_account_id flag and NEW_RELIC_API_KEY env var to be set")
+		return fmt.Errorf("You need to set up your New Relic One account ID in the -nr_account_id variable and your API key in the NEW_RELIC_API_KEY environment variable.")
 	}
-	if s.format != formats.FORMAT_NR && s.format != formats.FORMAT_JSON && s.format != formats.FORMAT_NRM {
-		return fmt.Errorf("New Relic only supports new_relic and json formats, not %s", s.format)
+	if s.format != formats.FORMAT_NR && s.format != formats.FORMAT_JSON_FLAT && s.format != formats.FORMAT_NRM {
+		return fmt.Errorf("You used the %s unsupported format. Use flat_json, new_relic, new_relic_metric.", s.format)
 	}
 	if s.compression != kt.CompressionGzip && s.compression != kt.CompressionNone {
-		return fmt.Errorf("New Relic only supports gzip and none compression, not %s", s.compression)
+		return fmt.Errorf("You used the %s unsupported compression format. Use gzip or no compression at all.", s.compression)
 	}
 
 	// Try to upcast the formater here. This lets us send events also.
@@ -182,7 +182,7 @@ func (s *NRSink) Init(ctx context.Context, format formats.Format, compression kt
 func (s *NRSink) Send(ctx context.Context, payload *kt.Output) {
 	if s.checkJson {
 		if err := s.doCheckJson(payload); err != nil {
-			s.Errorf("Invalid payload! Not sending -- len: %d, err: %v", len(payload.Body), err)
+			s.Errorf("You used an unsupported payload: %d. %v.", len(payload.Body), err)
 			return
 		}
 	}
@@ -220,7 +220,7 @@ func (s *NRSink) sendNR(ctx context.Context, payload *kt.Output, url string) {
 	}
 	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(payload.Body))
 	if err != nil {
-		s.Errorf("Cannot create NR request: %v", err)
+		s.Errorf("There was an error when communicating to New Relic One: %v.", err)
 		cbErr = err
 		return
 	}
@@ -236,29 +236,29 @@ func (s *NRSink) sendNR(ctx context.Context, payload *kt.Output, url string) {
 
 	resp, err := s.client.Do(req)
 	if err != nil {
-		s.Errorf("Cannot write to NR: %v, creating new client", err)
+		s.Errorf("There was an error when creating a new client in New Relic One: %v.", err)
 		cbErr = err
 		s.client = &http.Client{Transport: s.tr}
 	} else {
 		defer resp.Body.Close()
 		bdy, err := ioutil.ReadAll(resp.Body)
 		if err != nil {
-			s.Errorf("Cannot get resp body from NR: %v", err)
+			s.Errorf("There was an error when communicating to New Relic One: %v.", err)
 			cbErr = err
 			s.metrics.DeliveryErr.Mark(1)
 		} else {
 			if resp.StatusCode == 413 {
-				s.Errorf("Cannot write to NR, body too big. Adjusting max records down")
+				s.Errorf("There was an error when communicating to New Relic One. The message was too big.")
 				s.metrics.DeliveryErr.Mark(1)
 				s.tooBig <- len(payload.Body)
 			} else if resp.StatusCode >= 400 {
-				s.Errorf("Cannot write to NR, status code %d", resp.StatusCode)
+				s.Errorf("There was an error when communicating to New Relic One: %v.", resp.StatusCode)
 				s.metrics.DeliveryErr.Mark(1)
 			} else {
 				var nr NRResponce
 				err = json.Unmarshal(bdy, &nr)
 				if err != nil {
-					s.Errorf("Cannot parse resp from NR: %v", err)
+					s.Errorf("There was an error when parsing the response from New Relic One: %v.", err)
 					cbErr = err
 					s.metrics.DeliveryErr.Mark(1)
 				} else {
@@ -342,7 +342,7 @@ func (s *NRSink) sendLogBatch(ctx context.Context, logs []string) {
 
 	target, err := json.Marshal([]logSet{ls}) // Has to be an array here, no idea why.
 	if err != nil {
-		s.Errorf("Cannot marshal log set: %v", err)
+		s.Errorf("There was an error with logs: %v.", err)
 		return
 	}
 
@@ -355,19 +355,19 @@ func (s *NRSink) sendLogBatch(ctx context.Context, logs []string) {
 	buf.Reset()
 	zw, err := gzip.NewWriterLevel(buf, gzip.DefaultCompression)
 	if err != nil {
-		s.Errorf("Cannot gzip log set: %v", err)
+		s.Errorf("There was an error when compressing logs: %v.", err)
 		return
 	}
 
 	_, err = zw.Write(target)
 	if err != nil {
-		s.Errorf("Cannot write log set: %v", err)
+		s.Errorf("There was an error when writing logs: %v.", err)
 		return
 	}
 
 	err = zw.Close()
 	if err != nil {
-		s.Errorf("Cannot close log set: %v", err)
+		s.Errorf("There was an error when closing logs: %v.", err)
 		return
 	}
 
diff --git a/pkg/util/netflow/ipfix/decoder.go b/pkg/util/netflow/ipfix/decoder.go
index 7fb3fd5..9f2a854 100644
--- a/pkg/util/netflow/ipfix/decoder.go
+++ b/pkg/util/netflow/ipfix/decoder.go
@@ -10,7 +10,7 @@ import (
 )
 
 func errInvalidVersion(v uint16) error {
-	return fmt.Errorf("version %d is not a valid IPFIX message version", v)
+	return fmt.Errorf("You used an unsupported IPFix message version: %d.", v)
 }
 
 func errProtocol(f string) error {
@@ -18,7 +18,7 @@ func errProtocol(f string) error {
 }
 
 func errTemplateNotFound(t uint16) error {
-	return fmt.Errorf("template with id=%d not found", t)
+	return fmt.Errorf("The template with the %d ID was not found.", t)
 }
 
 // Decoder can decode multiple IPFIX messages from a stream.
diff --git a/pkg/util/netflow/ipfix/packet.go b/pkg/util/netflow/ipfix/packet.go
index dffb8f2..4a5908b 100644
--- a/pkg/util/netflow/ipfix/packet.go
+++ b/pkg/util/netflow/ipfix/packet.go
@@ -55,9 +55,9 @@ func (m *Message) UnmarshalSets(r io.Reader, s session.Session, t *Translate) er
 	readSize := int(m.Header.Length) - m.Header.Len()
 	if readSize <= 0 {
 		if debug {
-			fmt.Printf("ipfix message has illegal size %d bytes", m.Header.Length)
+			fmt.Printf("The IPFix message is too big: %d bytes.", m.Header.Length)
 		}
-		return fmt.Errorf("ipfix message has illegal size %d bytes", m.Header.Length)
+		return fmt.Errorf("The IPFix message is too big: %d bytes.", m.Header.Length)
 	}
 	data := make([]byte, readSize)
 	if ndata, err := io.ReadFull(r, data); err != nil {
@@ -82,7 +82,7 @@ func (m *Message) UnmarshalSets(r io.Reader, s session.Session, t *Translate) er
 			if debug {
 				debugLog.Printf("short read size of %d\n", readSize)
 			}
-			return fmt.Errorf("ipfix Set %d has illegal size %d bytes", i, readSize)
+			return fmt.Errorf("The %d IPFix message is too big: %d bytes.", i, readSize)
 		}
 
 		data := make([]byte, readSize)


Test patch:
diff --git a/pkg/inputs/snmp/mibs/load_test.go b/pkg/inputs/snmp/mibs/load_test.go
index 7350a64..e1ea4d9 100644
--- a/pkg/inputs/snmp/mibs/load_test.go
+++ b/pkg/inputs/snmp/mibs/load_test.go
@@ -65,7 +65,7 @@ func TestFullProvider(t *testing.T) {
 		".1.3.6.1.4.1.9.1.1639":       kt.ProviderRouter,
 		".1.3.6.1.4.1.9.1.449":        kt.ProviderSwitch,
 		".1.3.6.1.4.1.318":            kt.ProviderUPS,
-		".1.3.6.1.4.1.8072.3.2.8":     kt.ProviderRouter,
+		".1.3.6.1.4.1.8072.3.2.8":     kt.ProviderDefault,
 		".1.3.6.1.4.1.318.1.3.5.4":    kt.ProviderUPS,
 		".1.3.6.1.4.1.318.1.3.27":     kt.ProviderUPS,
 		".1.3.6.1.4.1.318.1.3.4.6":    kt.ProviderPDU,