diff --git a/api.go b/api.go
index c2edcb5..25cbbf2 100644
--- a/api.go
+++ b/api.go
@@ -21,21 +21,21 @@
 func initAPI(services apid.Services) {
 	log.Debug("initialized API's exposed by apidAnalytics plugin")
 	analyticsBasePath = config.GetString(configAnalyticsBasePath)
-	services.API().HandleFunc(analyticsBasePath + "/{bundle_scope_uuid}", saveAnalyticsRecord).Methods("POST")
+	services.API().HandleFunc(analyticsBasePath+"/{bundle_scope_uuid}", saveAnalyticsRecord).Methods("POST")
 }
 
 func saveAnalyticsRecord(w http.ResponseWriter, r *http.Request) {
 
 	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
 
-	db := getDB()				// When database isnt initialized
+	db := getDB() // When database isnt initialized
 	if db == nil {
-		writeError(w, http.StatusInternalServerError,"INTERNAL_SERVER_ERROR","Service is not initialized completely")
+		writeError(w, http.StatusInternalServerError, "INTERNAL_SERVER_ERROR", "Service is not initialized completely")
 		return
 	}
 
-	if !strings.EqualFold(r.Header.Get("Content-Type"),"application/json") {
-		writeError(w, http.StatusBadRequest, "UNSUPPORTED_CONTENT_TYPE","Only supported content type is application/json")
+	if !strings.EqualFold(r.Header.Get("Content-Type"), "application/json") {
+		writeError(w, http.StatusBadRequest, "UNSUPPORTED_CONTENT_TYPE", "Only supported content type is application/json")
 		return
 	}
 
@@ -50,7 +50,7 @@
 			writeError(w, http.StatusBadRequest, "UNKNOWN_SCOPE", dbErr.Reason)
 		}
 	} else {
-		err := processPayload(tenant, scopeuuid, r);
+		err := processPayload(tenant, scopeuuid, r)
 		if err.ErrorCode == "" {
 			w.WriteHeader(http.StatusOK)
 		} else {
diff --git a/api_helper.go b/api_helper.go
index f12605f..34ca14e 100644
--- a/api_helper.go
+++ b/api_helper.go
@@ -1,42 +1,41 @@
 package apidAnalytics
 
 import (
-	"encoding/json"
-	"net/http"
-	"io"
-	"strings"
 	"compress/gzip"
+	"encoding/json"
+	"io"
+	"net/http"
+	"strings"
 )
 
-
 /*
 Implements all the helper methods needed to process the POST /analytics payload and send it to the internal buffer channel
 */
 
 type developerInfo struct {
-	ApiProduct	string
-	DeveloperApp	string
-	DeveloperEmail	string
-	Developer	string
+	ApiProduct     string
+	DeveloperApp   string
+	DeveloperEmail string
+	Developer      string
 }
 
 type axRecords struct {
-	Tenant tenant
-	Records []interface{}		// Records is an array of multiple analytics records
+	Tenant  tenant
+	Records []interface{} // Records is an array of multiple analytics records
 }
 
 type tenant struct {
-	Org string
-	Env string
+	Org      string
+	Env      string
 	TenantId string
 }
 
-func processPayload(tenant tenant, scopeuuid string,  r *http.Request) errResponse {
+func processPayload(tenant tenant, scopeuuid string, r *http.Request) errResponse {
 	var gzipEncoded bool
 	if r.Header.Get("Content-Encoding") != "" {
-		if !strings.EqualFold(r.Header.Get("Content-Encoding"),"gzip") {
-			return errResponse{ErrorCode:"UNSUPPORTED_CONTENT_ENCODING", Reason:"Only supported content encoding is gzip"}
-		}  else {
+		if !strings.EqualFold(r.Header.Get("Content-Encoding"), "gzip") {
+			return errResponse{ErrorCode: "UNSUPPORTED_CONTENT_ENCODING", Reason: "Only supported content encoding is gzip"}
+		} else {
 			gzipEncoded = true
 		}
 	}
@@ -44,9 +43,9 @@
 	var reader io.ReadCloser
 	var err error
 	if gzipEncoded {
-		reader, err = gzip.NewReader(r.Body)			// reader for gzip encoded data
+		reader, err = gzip.NewReader(r.Body) // reader for gzip encoded data
 		if err != nil {
-			return errResponse{ErrorCode:"BAD_DATA", Reason:"Gzip Encoded data cannot be read"}
+			return errResponse{ErrorCode: "BAD_DATA", Reason: "Gzip Encoded data cannot be read"}
 		}
 	} else {
 		reader = r.Body
@@ -61,11 +60,11 @@
 
 func validateEnrichPublish(tenant tenant, scopeuuid string, reader io.Reader) errResponse {
 	var raw map[string]interface{}
-	decoder := json.NewDecoder(reader)		// Decode payload to JSON data
+	decoder := json.NewDecoder(reader) // Decode payload to JSON data
 	decoder.UseNumber()
 
 	if err := decoder.Decode(&raw); err != nil {
-		return errResponse{ErrorCode:"BAD_DATA", Reason:"Not a valid JSON payload"}
+		return errResponse{ErrorCode: "BAD_DATA", Reason: "Not a valid JSON payload"}
 	}
 
 	if records := raw["records"]; records != nil {
@@ -76,14 +75,14 @@
 			if valid {
 				enrich(recordMap, scopeuuid, tenant)
 			} else {
-				return err				// Even if there is one bad record, then reject entire batch
+				return err // Even if there is one bad record, then reject entire batch
 			}
 		}
 		axRecords := axRecords{Tenant: tenant, Records: records.([]interface{})}
 		// publish batch of records to channel (blocking call)
 		internalBuffer <- axRecords
 	} else {
-		return errResponse{ErrorCode:"NO_RECORDS", Reason:"No analytics records in the payload"}
+		return errResponse{ErrorCode: "NO_RECORDS", Reason: "No analytics records in the payload"}
 	}
 	return errResponse{}
 }
@@ -97,7 +96,7 @@
 	elems := []string{"client_received_start_timestamp"}
 	for _, elem := range elems {
 		if recordMap[elem] == nil {
-			return false, errResponse{ErrorCode:"MISSING_FIELD", Reason:"Missing Required field: " + elem}
+			return false, errResponse{ErrorCode: "MISSING_FIELD", Reason: "Missing Required field: " + elem}
 		}
 	}
 
@@ -105,7 +104,7 @@
 	cret, exists2 := recordMap["client_received_end_timestamp"]
 	if exists1 && exists2 {
 		if crst.(json.Number) > cret.(json.Number) {
-			return false, errResponse{ErrorCode:"BAD_DATA", Reason:"client_received_start_timestamp > client_received_end_timestamp"}
+			return false, errResponse{ErrorCode: "BAD_DATA", Reason: "client_received_start_timestamp > client_received_end_timestamp"}
 		}
 	}
 	return true, errResponse{}
diff --git a/apidAnalytics_suite_test.go b/apidAnalytics_suite_test.go
index 2e98e86..247212f 100644
--- a/apidAnalytics_suite_test.go
+++ b/apidAnalytics_suite_test.go
@@ -33,8 +33,8 @@
 	Expect(err).NotTo(HaveOccurred())
 
 	config.Set("data_path", testTempDir)
-	config.Set(uapServerBase, "http://localhost:9000") // dummy value
-	config.Set("apigeesync_apid_instance_id","abcdefgh-ijkl-mnop-qrst-uvwxyz123456") // dummy value
+	config.Set(uapServerBase, "http://localhost:9000")                                // dummy value
+	config.Set("apigeesync_apid_instance_id", "abcdefgh-ijkl-mnop-qrst-uvwxyz123456") // dummy value
 	config.Set(useCaching, true)
 
 	db, err := apid.Data().DB()
@@ -125,7 +125,7 @@
 		);
 	`)
 	if err != nil {
-		panic("Unable to initialize DB " +  err.Error())
+		panic("Unable to initialize DB " + err.Error())
 	}
 }
 
@@ -161,7 +161,7 @@
 		);
 	`)
 	if err != nil {
-		panic("Unable to initialize DB " +  err.Error())
+		panic("Unable to initialize DB " + err.Error())
 	}
 }
 
@@ -170,7 +170,7 @@
 	txn, err := db.Begin()
 	Expect(err).ShouldNot(HaveOccurred())
 	txn.Exec("INSERT INTO APP_CREDENTIAL_APIPRODUCT_MAPPER (tenant_id, appcred_id, app_id, apiprdt_id, status, _change_selector) "+
-		"VALUES" +
+		"VALUES"+
 		"($1,$2,$3,$4,$5,$6)",
 		"tenantid",
 		"testapikey",
@@ -178,33 +178,33 @@
 		"testproductid",
 		"APPROVED",
 		"12345",
-	);
+	)
 
 	txn.Exec("INSERT INTO APP (id, tenant_id, name, developer_id) "+
-		"VALUES" +
+		"VALUES"+
 		"($1,$2,$3,$4)",
 		"testappid",
 		"tenantid",
 		"testapp",
 		"testdeveloperid",
-	);
+	)
 
 	txn.Exec("INSERT INTO API_PRODUCT (id, tenant_id, name) "+
-		"VALUES" +
+		"VALUES"+
 		"($1,$2,$3)",
 		"testproductid",
 		"tenantid",
 		"testproduct",
-	);
+	)
 
 	txn.Exec("INSERT INTO DEVELOPER (id, tenant_id, username, email) "+
-		"VALUES" +
+		"VALUES"+
 		"($1,$2,$3,$4)",
 		"testdeveloperid",
 		"tenantid",
 		"testdeveloper",
 		"testdeveloper@test.com",
-	);
+	)
 
 	txn.Exec("INSERT INTO DATA_SCOPE (id, _change_selector, apid_cluster_id, scope, org, env) "+
 		"VALUES"+
@@ -215,11 +215,10 @@
 		"tenantid",
 		"testorg",
 		"testenv",
-	);
+	)
 	txn.Commit()
 }
 
-
 var _ = AfterSuite(func() {
 	apid.Events().Close()
 	if testServer != nil {
diff --git a/buffering_manager.go b/buffering_manager.go
index b9fa3d2..6ec1ec1 100644
--- a/buffering_manager.go
+++ b/buffering_manager.go
@@ -1,22 +1,24 @@
 package apidAnalytics
 
 import (
-	"time"
-	"os"
 	"bufio"
 	"compress/gzip"
-	"path/filepath"
-	"fmt"
 	"crypto/rand"
 	"encoding/json"
+	"fmt"
+	"os"
+	"path/filepath"
+	"time"
 )
 
-const fileExtension = ".txt.gz";
+const fileExtension = ".txt.gz"
 
 // Channel where analytics records are buffered before being dumped to a file as write to file should not performed in the Http Thread
 var internalBuffer chan axRecords
+
 // Channel where close bucket event is published i.e. when a bucket is ready to be closed based on collection interval
 var closeBucketEvent chan bucket
+
 // Map from timestampt to bucket
 var bucketMap map[int64]bucket
 
@@ -28,19 +30,19 @@
 
 // This struct will store open file handle and writer to close the file
 type fileWriter struct {
-	file  *os.File
-	gw *gzip.Writer
-	bw *bufio.Writer
+	file *os.File
+	gw   *gzip.Writer
+	bw   *bufio.Writer
 }
 
 func initBufferingManager() {
 	internalBuffer = make(chan axRecords, config.GetInt(analyticsBufferChannelSize))
-	closeBucketEvent = make(chan  bucket)
+	closeBucketEvent = make(chan bucket)
 	bucketMap = make(map[int64]bucket)
 
 	// Keep polling the internal buffer for new messages
 	go func() {
-		for  {
+		for {
 			records := <-internalBuffer
 			err := save(records)
 			if err != nil {
@@ -51,8 +53,8 @@
 
 	// Keep polling the closeEvent channel to see if bucket is ready to be closed
 	go func() {
-		for  {
-			bucket := <- closeBucketEvent
+		for {
+			bucket := <-closeBucketEvent
 			log.Debugf("Close Event received for bucket: %s", bucket.DirName)
 
 			// close open file
@@ -70,19 +72,18 @@
 }
 
 // Save records to correct file based on what timestamp data is being collected for
-func save(records axRecords) (error) {
+func save(records axRecords) error {
 	bucket, err := getBucketForTimestamp(time.Now(), records.Tenant)
-	if (err != nil ) {
+	if err != nil {
 		return err
 	}
 	writeGzipFile(bucket.FileWriter, records.Records)
 	return nil
 }
 
-
 func getBucketForTimestamp(now time.Time, tenant tenant) (bucket, error) {
 	// first based on current timestamp and collection interval, determine the timestamp of the bucket
-	ts :=  now.Unix() / int64(config.GetInt(analyticsCollectionInterval)) * int64(config.GetInt(analyticsCollectionInterval))
+	ts := now.Unix() / int64(config.GetInt(analyticsCollectionInterval)) * int64(config.GetInt(analyticsCollectionInterval))
 	_, exists := bucketMap[ts]
 	if exists {
 		return bucketMap[ts], nil
@@ -90,7 +91,7 @@
 		timestamp := time.Unix(ts, 0).Format(timestampLayout)
 
 		// endtimestamp of bucket = starttimestamp + collectionInterval
-		endTime := time.Unix(ts + int64(config.GetInt(analyticsCollectionInterval)), 0)
+		endTime := time.Unix(ts+int64(config.GetInt(analyticsCollectionInterval)), 0)
 		endtimestamp := endTime.Format(timestampLayout)
 
 		dirName := tenant.Org + "~" + tenant.Env + "~" + timestamp
@@ -114,9 +115,9 @@
 		bucketMap[ts] = newBucket
 
 		//Send event to close directory after endTime + 5 seconds to make sure all buffers are flushed to file
-		timer := time.After(endTime.Sub(time.Now()) + time.Second * 5)
+		timer := time.After(endTime.Sub(time.Now()) + time.Second*5)
 		go func() {
-			<- timer
+			<-timer
 			closeBucketEvent <- newBucket
 		}()
 		return newBucket, nil
@@ -133,7 +134,7 @@
 func createGzipFile(s string) (fileWriter, error) {
 	file, err := os.OpenFile(s, os.O_WRONLY|os.O_CREATE, os.ModePerm)
 	if err != nil {
-		return fileWriter{},fmt.Errorf("Cannot create file '%s' to buffer messages '%v'", s, err)
+		return fileWriter{}, fmt.Errorf("Cannot create file '%s' to buffer messages '%v'", s, err)
 	}
 	gw := gzip.NewWriter(file)
 	bw := bufio.NewWriter(gw)
@@ -160,4 +161,3 @@
 	fw.gw.Close()
 	fw.file.Close()
 }
-
diff --git a/common_helper.go b/common_helper.go
index 89b37bc..d4e26d5 100644
--- a/common_helper.go
+++ b/common_helper.go
@@ -8,10 +8,13 @@
 
 // Cache for scope uuid to org, env and tenantId information
 var tenantCache map[string]tenant
+
 // RW lock for tenant map cache since the cache can be read while its being written to and vice versa
 var tenantCachelock = sync.RWMutex{}
+
 // Cache for apiKey~tenantId to developer related information
 var developerInfoCache map[string]developerInfo
+
 // RW lock for developerInfo map cache since the cache can be read while its being written to and vice versa
 var developerInfoCacheLock = sync.RWMutex{}
 
@@ -25,13 +28,13 @@
 
 	if error != nil {
 		return fmt.Errorf("Count not get datascope from DB due to: %v", error)
-	} else  {
+	} else {
 		defer rows.Close()
 		// Lock before writing to the map as it has multiple readers
 		tenantCachelock.Lock()
 		defer tenantCachelock.Unlock()
 		for rows.Next() {
-			rows.Scan(&env, &org, &tenantId, &id);
+			rows.Scan(&env, &org, &tenantId, &id)
 			tenantCache[id] = tenant{Org: org, Env: env, TenantId: tenantId}
 		}
 	}
@@ -43,7 +46,7 @@
 // Load data scope information into an in-memory cache so that for each record a DB lookup is not required
 func createDeveloperInfoCache() error {
 	developerInfoCache = make(map[string]developerInfo)
-	var apiProduct, developerApp, developerEmail, developer  sql.NullString
+	var apiProduct, developerApp, developerEmail, developer sql.NullString
 	var tenantId, apiKey string
 
 	db := getDB()
@@ -62,7 +65,7 @@
 		developerInfoCacheLock.Lock()
 		defer developerInfoCacheLock.Unlock()
 		for rows.Next() {
-			rows.Scan(&tenantId,&apiKey,&apiProduct, &developerApp, &developer, &developerEmail)
+			rows.Scan(&tenantId, &apiKey, &apiProduct, &developerApp, &developer, &developerEmail)
 
 			keyForMap := getKeyForDeveloperInfoCache(tenantId, apiKey)
 			apiPrd := getValuesIgnoringNull(apiProduct)
@@ -80,7 +83,7 @@
 
 // Returns Tenant Info given a scope uuid from the cache or by querying the DB directly based on useCachig config
 func getTenantForScope(scopeuuid string) (tenant, dbError) {
-	if (config.GetBool(useCaching)) {
+	if config.GetBool(useCaching) {
 		_, exists := tenantCache[scopeuuid]
 		if !exists {
 			reason := "No tenant found for this scopeuuid: " + scopeuuid
@@ -110,13 +113,13 @@
 			errorCode := "INTERNAL_SEARCH_ERROR"
 			return tenant{}, dbError{ErrorCode: errorCode, Reason: reason}
 		}
-		return tenant{Org: org, Env:env, TenantId: tenantId}, dbError{}
+		return tenant{Org: org, Env: env, TenantId: tenantId}, dbError{}
 	}
 }
 
 // Returns Dveloper related info given an apiKey and tenantId from the cache or by querying the DB directly based on useCachig config
 func getDeveloperInfo(tenantId string, apiKey string) developerInfo {
-	if (config.GetBool(useCaching)) {
+	if config.GetBool(useCaching) {
 		keyForMap := getKeyForDeveloperInfoCache(tenantId, apiKey)
 		_, exists := developerInfoCache[keyForMap]
 		if !exists {
@@ -131,7 +134,7 @@
 			return developerInfoCache[keyForMap]
 		}
 	} else {
-		var apiProduct, developerApp, developerEmail, developer  sql.NullString
+		var apiProduct, developerApp, developerEmail, developer sql.NullString
 
 		db := getDB()
 		sSql := "SELECT ap.name, a.name, d.username, d.email " +
diff --git a/common_helper_test.go b/common_helper_test.go
index 126602d..c691d52 100644
--- a/common_helper_test.go
+++ b/common_helper_test.go
@@ -1,6 +1,5 @@
 package apidAnalytics
 
-
 import (
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
@@ -29,7 +28,7 @@
 var _ = Describe("test getDeveloperInfo()", func() {
 	Context("get developerInfo for valid tenantId and apikey", func() {
 		It("should return all right data", func() {
-			developerInfo := getDeveloperInfo("tenantid","testapikey")
+			developerInfo := getDeveloperInfo("tenantid", "testapikey")
 			Expect(developerInfo.ApiProduct).To(Equal("testproduct"))
 			Expect(developerInfo.Developer).To(Equal("testdeveloper"))
 			Expect(developerInfo.DeveloperEmail).To(Equal("testdeveloper@test.com"))
@@ -39,11 +38,11 @@
 
 	Context("get developerInfo for invalid tenantId and apikey", func() {
 		It("should return all right data", func() {
-			developerInfo := getDeveloperInfo("wrongid","wrongapikey")
+			developerInfo := getDeveloperInfo("wrongid", "wrongapikey")
 			Expect(developerInfo.ApiProduct).To(Equal(""))
 			Expect(developerInfo.Developer).To(Equal(""))
 			Expect(developerInfo.DeveloperEmail).To(Equal(""))
 			Expect(developerInfo.DeveloperApp).To(Equal(""))
 		})
 	})
-})
\ No newline at end of file
+})
diff --git a/crash_recovery.go b/crash_recovery.go
index 7811d9c..b34dc9d 100644
--- a/crash_recovery.go
+++ b/crash_recovery.go
@@ -1,20 +1,19 @@
 package apidAnalytics
 
 import (
-	"time"
-	"io/ioutil"
-	"path/filepath"
 	"bufio"
-	"os"
-	"strings"
 	"compress/gzip"
+	"io/ioutil"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
 )
 
-
 const (
-	crashRecoveryDelay = 30  // seconds
-	recoveryTSLayout = "20060102150405.000" // same as "yyyyMMddHHmmss.SSS" format (Appended to Recovered folder and file)
-	recoveredTS  = "~recoveredTS~"	      // Constant to identify recovered files
+	crashRecoveryDelay = 30                   // seconds
+	recoveryTSLayout   = "20060102150405.000" // same as "yyyyMMddHHmmss.SSS" format (Appended to Recovered folder and file)
+	recoveredTS        = "~recoveredTS~"      // Constant to identify recovered files
 )
 
 func initCrashRecovery() {
@@ -22,16 +21,16 @@
 		timer := time.After(time.Second * crashRecoveryDelay)
 		// Actual recovery of files is attempted asynchronously after a delay to not block the apid plugin from starting up
 		go func() {
-			<- timer
+			<-timer
 			performRecovery()
 		}()
 	}
 }
 
 // Crash recovery is needed if there are any folders in tmp or recovered directory
-func crashRecoveryNeeded() (bool) {
+func crashRecoveryNeeded() bool {
 	recoveredDirRecoveryNeeded := recoverFolderInRecoveredDir()
-	tmpDirRecoveryNeeded :=  recoverFoldersInTmpDir()
+	tmpDirRecoveryNeeded := recoverFoldersInTmpDir()
 	needed := tmpDirRecoveryNeeded || recoveredDirRecoveryNeeded
 	if needed {
 		log.Infof("Crash Recovery is needed and will be attempted in %d seconds", crashRecoveryDelay)
@@ -43,14 +42,14 @@
 // This partial data can be recoverd.
 func recoverFoldersInTmpDir() bool {
 	tmpRecoveryNeeded := false
-	dirs,_ := ioutil.ReadDir(localAnalyticsTempDir)
+	dirs, _ := ioutil.ReadDir(localAnalyticsTempDir)
 	recoveryTS := getRecoveryTS()
 	for _, dir := range dirs {
 		tmpRecoveryNeeded = true
 		log.Debugf("Moving directory '%s' from tmp to recovered folder", dir.Name())
 		tmpCompletePath := filepath.Join(localAnalyticsTempDir, dir.Name())
-		newDirName :=  dir.Name() + recoveredTS + recoveryTS;			// Eg. org~env~20160101222400~recoveredTS~20160101222612.123
-		recoveredCompletePath := filepath.Join(localAnalyticsRecoveredDir,newDirName)
+		newDirName := dir.Name() + recoveredTS + recoveryTS // Eg. org~env~20160101222400~recoveredTS~20160101222612.123
+		recoveredCompletePath := filepath.Join(localAnalyticsRecoveredDir, newDirName)
 		err := os.Rename(tmpCompletePath, recoveredCompletePath)
 		if err != nil {
 			log.Errorf("Cannot move directory '%s' from tmp to recovered folder", dir.Name())
@@ -75,17 +74,17 @@
 	return false
 }
 
-func performRecovery()  {
-	log.Info("Crash recovery is starting...");
+func performRecovery() {
+	log.Info("Crash recovery is starting...")
 	recoveryDirs, _ := ioutil.ReadDir(localAnalyticsRecoveredDir)
 	for _, dir := range recoveryDirs {
-		recoverDirectory(dir.Name());
+		recoverDirectory(dir.Name())
 	}
-	log.Info("Crash recovery complete...");
+	log.Info("Crash recovery complete...")
 }
 
 func recoverDirectory(dirName string) {
-	log.Infof("performing crash recovery for directory: %s", dirName);
+	log.Infof("performing crash recovery for directory: %s", dirName)
 	var bucketRecoveryTS string
 
 	// Parse bucket name to extract recoveryTS and pass it each file to be recovered
@@ -99,7 +98,7 @@
 	files, _ := ioutil.ReadDir(dirBeingRecovered)
 	for _, file := range files {
 		// recovering each file sequentially for now
-		recoverFile(bucketRecoveryTS, dirName, file.Name());
+		recoverFile(bucketRecoveryTS, dirName, file.Name())
 	}
 
 	stagingPath := filepath.Join(localAnalyticsStagingDir, dirName)
@@ -120,8 +119,8 @@
 	recoveredFilePath := filepath.Join(localAnalyticsRecoveredDir, dirName, recoveredFileName)
 
 	// Copy complete records to new file and delete original partial file
-	copyPartialFile(completeOrigFilePath, recoveredFilePath);
-	deletePartialFile(completeOrigFilePath);
+	copyPartialFile(completeOrigFilePath, recoveredFilePath)
+	deletePartialFile(completeOrigFilePath)
 }
 
 // The file is read line by line and all complete records are extracted and copied to a new file which is closed as a correct gzip file.
@@ -172,4 +171,4 @@
 	if err != nil {
 		log.Errorf("Cannot delete partial file: %s", completeOrigFilePath)
 	}
-}
\ No newline at end of file
+}
diff --git a/init.go b/init.go
index 40949bd..e383f16 100644
--- a/init.go
+++ b/init.go
@@ -4,8 +4,8 @@
 	"fmt"
 	"github.com/30x/apid"
 	"os"
-	"sync"
 	"path/filepath"
+	"sync"
 )
 
 const (
@@ -26,7 +26,7 @@
 	analyticsUploadIntervalDefault = "5"
 
 	// Number of slots for internal channel buffering of analytics records before they are dumped to a file
-	analyticsBufferChannelSize  = "apidanalytics_buffer_channel_size"
+	analyticsBufferChannelSize        = "apidanalytics_buffer_channel_size"
 	analyticsBufferChannelSizeDefault = 100
 
 	// EdgeX endpoint base path to access Uap Collection Endpoint
@@ -34,16 +34,16 @@
 
 	// If caching is used then data scope and developer info will be maintained in-memory
 	// cache to avoid DB calls for each analytics message
-	useCaching = "apidanalytics_use_caching"
+	useCaching        = "apidanalytics_use_caching"
 	useCachingDefault = true
 )
 
 // keep track of the services that this plugin will use
 var (
-	log    apid.LogService
-	config apid.ConfigService
-	data   apid.DataService
-	events apid.EventsService
+	log      apid.LogService
+	config   apid.ConfigService
+	data     apid.DataService
+	events   apid.EventsService
 	unsafeDB apid.DB
 	dbMux    sync.RWMutex
 
diff --git a/listener.go b/listener.go
index 846a05e..53d4bdd 100644
--- a/listener.go
+++ b/listener.go
@@ -5,7 +5,7 @@
 	"github.com/apigee-labs/transicator/common"
 )
 
-type handler struct {}
+type handler struct{}
 
 func (h *handler) String() string {
 	return "apigeeAnalytics"
@@ -35,7 +35,7 @@
 	}
 	setDB(db)
 
-	if (config.GetBool(useCaching)) {
+	if config.GetBool(useCaching) {
 		err = createTenantCache()
 		if err != nil {
 			log.Error(err)
@@ -55,7 +55,7 @@
 }
 
 func processChange(changes *common.ChangeList) {
-	if (config.GetBool(useCaching)) {
+	if config.GetBool(useCaching) {
 		log.Debugf("apigeeSyncEvent: %d changes", len(changes.Changes))
 		var rows []common.Row
 
diff --git a/upload_manager.go b/upload_manager.go
index 1cc3bc2..1ae94a5 100644
--- a/upload_manager.go
+++ b/upload_manager.go
@@ -8,7 +8,7 @@
 )
 
 const (
-	maxRetries = 3
+	maxRetries              = 3
 	retryFailedDirBatchSize = 10
 )
 
@@ -96,4 +96,4 @@
 			break
 		}
 	}
-}
\ No newline at end of file
+}
diff --git a/uploader.go b/uploader.go
index d8be63c..a8292a3 100644
--- a/uploader.go
+++ b/uploader.go
@@ -1,33 +1,33 @@
 package apidAnalytics
 
 import (
-	"os"
 	"encoding/json"
-	"strings"
-	"path/filepath"
+	"fmt"
 	"io/ioutil"
 	"net/http"
-	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
 	"time"
 )
 
-const timestampLayout = "20060102150405"				// same as yyyyMMddHHmmss
+const timestampLayout = "20060102150405" // same as yyyyMMddHHmmss
 
 var token string
 
 var client *http.Client = &http.Client{
-		Timeout: time.Duration(60 * time.Second),		//set default timeout of 60 seconds while connecting to s3/GCS
-          }
+	Timeout: time.Duration(60 * time.Second), //set default timeout of 60 seconds while connecting to s3/GCS
+}
 
 func addHeaders(req *http.Request) {
 	token = config.GetString("apigeesync_bearer_token")
-	req.Header.Add("Authorization", "Bearer " + token)
+	req.Header.Add("Authorization", "Bearer "+token)
 }
 
 func uploadDir(dir os.FileInfo) bool {
 	// Eg. org~env~20160101224500
 	tenant, timestamp := splitDirName(dir.Name())
-	dateTimePartition := getDateFromDirTimestamp(timestamp) 	//date=2016-01-01/time=22-45
+	dateTimePartition := getDateFromDirTimestamp(timestamp) //date=2016-01-01/time=22-45
 
 	completePath := filepath.Join(localAnalyticsStagingDir, dir.Name())
 	files, _ := ioutil.ReadDir(completePath)
@@ -36,8 +36,8 @@
 	var error error
 	for _, file := range files {
 		completeFilePath := filepath.Join(completePath, file.Name())
-		relativeFilePath := dateTimePartition + "/" + file.Name();
-		status, error = uploadFile(tenant,relativeFilePath, completeFilePath)
+		relativeFilePath := dateTimePartition + "/" + file.Name()
+		status, error = uploadFile(tenant, relativeFilePath, completeFilePath)
 		if error != nil {
 			log.Errorf("Upload failed due to: %v", error)
 			break
@@ -51,7 +51,7 @@
 
 func uploadFile(tenant, relativeFilePath, completeFilePath string) (bool, error) {
 	signedUrl, err := getSignedUrl(tenant, relativeFilePath)
-	if (err != nil) {
+	if err != nil {
 		return false, err
 	} else {
 		return uploadFileToDatastore(completeFilePath, signedUrl)
@@ -84,13 +84,13 @@
 	defer resp.Body.Close()
 
 	respBody, _ := ioutil.ReadAll(resp.Body)
-	if(resp.StatusCode == 200) {
+	if resp.StatusCode == 200 {
 		var body map[string]interface{}
 		json.Unmarshal(respBody, &body)
-		signedURL :=  body["url"]
+		signedURL := body["url"]
 		return signedURL.(string), nil
 	} else {
-		return "", fmt.Errorf("Error while getting signed URL '%v'",resp.Status)
+		return "", fmt.Errorf("Error while getting signed URL '%v'", resp.Status)
 	}
 }
 
@@ -122,27 +122,27 @@
 	}
 	defer resp.Body.Close()
 
-	if(resp.StatusCode == 200) {
+	if resp.StatusCode == 200 {
 		return true, nil
 	} else {
-		return false,fmt.Errorf("Final Datastore (S3/GCS)returned Error '%v'", resp.Status)
+		return false, fmt.Errorf("Final Datastore (S3/GCS)returned Error '%v'", resp.Status)
 	}
 }
 
 // Extract tenant and timestamp from directory Name
-func splitDirName(dirName string) (string, string){
+func splitDirName(dirName string) (string, string) {
 	s := strings.Split(dirName, "~")
-	tenant := s[0]+"~"+s[1]
+	tenant := s[0] + "~" + s[1]
 	timestamp := s[2]
-	return  tenant, timestamp
+	return tenant, timestamp
 }
 
 // files are uploaded to S3 under specific date time partition and that key needs to be generated from the plugin
 // eg. <...prefix generated by uap collection service...>/date=2016-01-02/time=15-45/filename.txt.gz
-func getDateFromDirTimestamp(timestamp string) (string){
+func getDateFromDirTimestamp(timestamp string) string {
 	dateTime, _ := time.Parse(timestampLayout, timestamp)
-	date := dateTime.Format("2006-01-02")			// same as YYYY-MM-dd
-	time :=  dateTime.Format("15-04")			// same as HH-mm
-	dateHourTS := "date=" + date  + "/time=" + time
+	date := dateTime.Format("2006-01-02") // same as YYYY-MM-dd
+	time := dateTime.Format("15-04")      // same as HH-mm
+	dateHourTS := "date=" + date + "/time=" + time
 	return dateHourTS
-}
\ No newline at end of file
+}
