{"id":15776701,"url":"https://github.com/devigned/apmz-sdk","last_synced_at":"2025-03-31T15:31:54.581Z","repository":{"id":144204654,"uuid":"225988640","full_name":"devigned/apmz-sdk","owner":"devigned","description":"Application Insights SDK derived from upstream MSFT repo","archived":false,"fork":false,"pushed_at":"2019-12-06T23:27:01.000Z","size":260,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-10-05T17:23:30.047Z","etag":null,"topics":["apm","apm-client"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devigned.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-05T01:17:48.000Z","updated_at":"2020-06-04T20:18:43.000Z","dependencies_parsed_at":null,"dependency_job_id":"5b8fcede-a6eb-40be-9953-22a427a0d5cf","html_url":"https://github.com/devigned/apmz-sdk","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devigned%2Fapmz-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devigned%2Fapmz-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devigned%2Fapmz-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devigned%2Fapmz-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devigned","download_url":"https://codeload.github.com/devigned/apmz-sdk/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237547534,"owners_count":19327871,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apm","apm-client"],"created_at":"2024-10-04T17:23:32.690Z","updated_at":"2025-02-06T21:14:24.833Z","avatar_url":"https://github.com/devigned.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Microsoft Application Insights SDK for Go\n[![Go Report Card](https://goreportcard.com/badge/github.com/devigned/apmz-sdk)](https://goreportcard.com/report/github.com/devigned/apmz-sdk)\n[![Actions Status](https://github.com/devigned/apmz-sdk/workflows/ci/badge.svg)](https://github.com/devigned/apmz-sdk/actions) \n[![Documentation](https://godoc.org/github.com/devigned/apmz-sdk?status.svg)](https://godoc.org/github.com/devigned/apmz-sdk)\n[![Coverage Status](https://coveralls.io/repos/github/devigned/apmz-sdk/badge.svg?branch=master)](https://coveralls.io/github/devigned/apmz-sdk?branch=master)\n\nThis project provides a Go SDK for Application Insights.\n[Application Insights](http://azure.microsoft.com/en-us/services/application-insights/)\nis a service that allows developers to keep their applications available,\nperformant, and successful.  This go package will allow you to send\ntelemetry of various kinds (event, metric, trace) to the Application\nInsights service where they can be visualized in the Azure Portal.\n\n## Status\nThis SDK is NOT maintained or supported by Microsoft even though we've contributed to it in the past. \nNote that Azure Monitor only provides support when using our [supported SDKs](https://docs.microsoft.com/en-us/azure/azure-monitor/app/platforms#unsupported-community-sdks), \nand this SDK does not yet meet that standard.  Known gaps include:\n\n* Operation correlation is not supported, but this can be managed by the\n  caller through the interfaces that exist today.\n* Sampling is not supported.  The more mature SDKs support dynamic sampling,\n  but at present this does not even support manual sampling.\n* Automatic collection of events is not supported.  All telemetry must be\n  explicitly collected and sent by the user.\n* Offline storage of telemetry is not supported.  The .Net SDK is capable of\n  spilling events to disk in case of network interruption.  This SDK has no\n  such feature.\n\n## Requirements\n**Install**\n```\ngo get -u github.com/devigned/apmz-sdk\n```\n**Get an instrumentation key**\n\u003e**Note**: an instrumentation key is required before any data can be sent. Please see the \"[Getting an Application Insights Instrumentation Key](https://github.com/microsoft/AppInsights-Home/wiki#getting-an-application-insights-instrumentation-key)\" section of the wiki for more information. To try the SDK without an instrumentation key, set the instrumentationKey config value to a non-empty string.\n\n# Usage\n\n## Setup\n\nTo start tracking telemetry, you'll want to first initialize a\n[telemetry client](https://godoc.org/github.com/devigned/apmz-sdk/apmz#TelemetryClient).\n\n```go\nimport \"github.com/devigned/apmz-sdk/apmz\"\n\nfunc main() {\n\tclient := apmz.NewTelemetryClient(\"\u003cinstrumentation key\u003e\")\n}\n```\n\nIf you want more control over the client's behavior, you should initialize a\nnew [TelemetryConfiguration](https://godoc.org/github.com/devigned/apmz-sdk/apmz#TelemetryConfiguration)\nobject and use it to create a client:\n\n```go\nimport \"time\"\nimport \"github.com/devigned/apmz-sdk/apmz\"\n\nfunc main() {\n\ttelemetryConfig := apmz.NewTelemetryConfiguration(\"\u003cinstrumentation key\u003e\")\n\t\n\t// Configure how many items can be sent in one call to the data collector:\n\ttelemetryConfig.MaxBatchSize = 8192\n\t\n\t// Configure the maximum delay before sending queued telemetry:\n\ttelemetryConfig.MaxBatchInterval = 2 * time.Second\n\t\n\tclient := apmz.NewTelemetryClientFromConfig(telemetryConfig)\n}\n```\n\nThis client will be used to submit all of your telemetry to Application\nInsights.  This SDK does not presently collect any telemetry automatically,\nso you will use this client extensively to report application health and\nstatus.  You may want to store it in a global variable or otherwise include\nit in your data model.\n\n## Telemetry submission\n\nThe [TelemetryClient](https://godoc.org/github.com/devigned/apmz-sdk/apmz#TelemetryClient)\nitself has several methods for submitting telemetry:\n\n```go\ntype TelemetryClient interface {\n\t// (much omitted)\n\n\t// Log a user action with the specified name\n\tTrackEvent(name string)\n\n\t// Log a numeric value that is not specified with a specific event.\n\t// Typically used to send regular reports of performance indicators.\n\tTrackMetric(name string, value float64)\n\n\t// Log a trace message with the specified severity level.\n\tTrackTrace(name string, severity contracts.SeverityLevel)\n\n\t// Log an HTTP request with the specified method, URL, duration and\n\t// response code.\n\tTrackRequest(method, url string, duration time.Duration, responseCode string)\n\n\t// Log a dependency with the specified name, type, target, and\n\t// success status.\n\tTrackRemoteDependency(name, dependencyType, target string, success bool)\n\n\t// Log an availability test result with the specified test name,\n\t// duration, and success status.\n\tTrackAvailability(name string, duration time.Duration, success bool)\n\n\t// Log an exception with the specified error, which may be a string,\n\t// error or Stringer. The current callstack is collected\n\t// automatically.\n\tTrackException(err interface{})\n}\n```\n\nThese may be used directly to log basic telemetry a manner you might expect:\n\n```go\nclient.TrackMetric(\"Queue Length\", len(queue))\n\nclient.TrackEvent(\"Client connected\")\n```\n\nBut the inputs to these methods only capture the very basics of what these\ntelemetry types can represent.  For example, all telemetry supports custom\nproperties, which are inaccessible through the above methods.  More complete\nversions are available through use of *telemetry item* classes, which can\nthen be submitted through the `TelemetryClient.Track` method, as illustrated\nin the below sections:\n\n### Trace\n[Trace telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#TraceTelemetry)\nrepresent printf-like trace statements that can be text searched.  They have\nan associated severity level, values for which are found in the package's\nconstants:\n\n```go\nconst (\n\tVerbose     contracts.SeverityLevel = contracts.Verbose\n\tInformation contracts.SeverityLevel = contracts.Information\n\tWarning     contracts.SeverityLevel = contracts.Warning\n\tError       contracts.SeverityLevel = contracts.Error\n\tCritical    contracts.SeverityLevel = contracts.Critical\n)\n```\n\nTrace telemetry is fairly simple, but common telemetry properties are also\navailable:\n\n```go\ntrace := apmz.NewTraceTelemetry(\"message\", appinsights.Warning)\n\n// You can set custom properties on traces\ntrace.Properties[\"module\"] = \"server\"\n\n// You can also fudge the timestamp:\ntrace.Timestamp = time.Now().Sub(time.Minute)\n\n// Finally, track it\nclient.Track(trace)\n```\n\n### Events\n[Event telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#EventTelemetry)\nrepresent structured event records.\n\n```go\nevent := apmz.NewEventTelemetry(\"button clicked\")\nevent.Properties[\"property\"] = \"value\"\nclient.Track(event)\n```\n\n### Single-value metrics\n[Metric telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#MetricTelemetry)\neach represent a single data point.\n\n```go\nmetric := apmz.NewMetricTelemetry(\"Queue length\", len(q.items))\nmetric.Properties[\"Queue name\"] = q.name\nclient.Track(metric)\n```\n\n### Pre-aggregated metrics\nTo reduce the number of metric values that may be sent through telemetry,\nwhen using a particularly high volume of measurements, metric data can be\n[pre-aggregated by the client](https://godoc.org/github.com/devigned/apmz-sdk/apmz#AggregateMetricTelemetry)\nand submitted all at once.\n\n```go\naggregate := apmz.NewAggregateMetricTelemetry(\"metric name\")\n\nvar dataPoints []float64\n// ...collect data points...\n\n// If the data is sampled, then one should use the AddSampledData method to\n// feed data to this telemetry type.\naggregate.AddSampledData(dataPoints)\n\n// If the entire population of data points is known, then one should instead\n// use the AddData method.  The difference between the two is the manner in\n// which the standard deviation is calculated.\naggregate.AddData(dataPoints)\n\n// Alternatively, you can aggregate the data yourself and supply it to this\n// telemetry item:\naggregate.Value = sum(dataPoints)\naggregate.Min = min(dataPoints)\naggregate.Max = max(dataPoints)\naggregate.Count = len(dataPoints)\naggregate.StdDev = stdDev(dataPoints)\n\n// Custom properties could be further added here...\n\n// Finally, track it:\nclient.Track(aggregate)\n```\n\n### Requests\n[Request telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#RequestTelemetry)\nrepresent completion of an external request to the application and contains\na summary of that request execution and results.  This SDK's request\ntelemetry is focused on HTTP requests.\n\n```go\nrequest := apmz.NewRequestTelemetry(\"GET\", \"https://microsoft.com/\", duration, \"\u003cresponse code\u003e\")\n\n// Note that the timestamp will be set to time.Now() minus the\n// specified duration.  This can be overridden by either manually\n// setting the Timestamp and Duration fields, or with MarkTime:\nrequest.MarkTime(requestStartTime, requestEndTime)\n\n// Source of request\nrequest.Source = clientAddress\n\n// Success is normally inferred from the responseCode, but can be overridden:\nrequest.Success = false\n\n// Request ID's are randomly generated GUIDs, but this can also be overridden:\nrequest.Id = \"\u003cid\u003e\"\n\n// Custom properties and measurements can be set here\nrequest.Properties[\"user-agent\"] = request.headers[\"User-agent\"]\nrequest.Measurements[\"POST size\"] = float64(len(data))\n\n// Context tags become more useful here as well\nrequest.Tags.Session().SetId(\"\u003csession id\u003e\")\nrequest.Tags.User().SetAccountId(\"\u003cuser id\u003e\")\n\n// Finally track it\nclient.Track(request)\n```\n\n### Dependencies\n[Remote dependency telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#RemoteDependencyTelemetry)\nrepresent interactions of the monitored component with a remote\ncomponent/service like SQL or an HTTP endpoint.\n\n```go\ndependency := apmz.NewRemoteDependencyTelemetry(\"Redis cache\", \"Redis\", \"\u003ctarget\u003e\", true /* success */)\n\n// The result code is typically an error code or response status code\ndependency.ResultCode = \"OK\"\n\n// Id's can be used for correlation if the remote end is also logging\n// telemetry through application insights.\ndependency.Id = \"\u003crequest id\u003e\"\n\n// Data may contain the exact URL hit or SQL statements\ndependency.Data = \"MGET \u003cargs\u003e\"\n\n// The duration can be set directly:\ndependency.Duration = time.Minute\n// or via MarkTime:\ndependency.MarkTime(startTime, endTime)\n\n// Properties and measurements may be set.\ndependency.Properties[\"shard-instance\"] = \"\u003cname\u003e\"\ndependency.Measurements[\"data received\"] = float64(len(response.data))\n\n// Submit the telemetry\nclient.Track(dependency)\n```\n\n### Exceptions\n[Exception telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#ExceptionTelemetry)\nrepresent handled or unhandled exceptions that occurred during the execution\nof the monitored application.  This SDK is geared towards handling panics or\nunexpected results from important functions:\n\nTo handle a panic:\n\n```go\nfunc method(client apmz.TelemetryClient) {\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\t// Track the panic\n\t\t\tclient.TrackException(r)\n\n\t\t\t// Optionally, you may want to re-throw the panic:\n\t\t\tpanic(r)\n\t\t}\n\t}()\n\t\n\t// Panics in any code below will be handled by the above.\n\tpanic(\"AHHHH!!\")\n}\n```\n\nThis can be condensed with a helper function:\n\n```go\nfunc method(client apmz.TelemetryClient) {\n\t// false indicates that we should have this handle the panic, and\n\t// not re-throw it.\n\tdefer apmz.TrackPanic(client, false)\n\t\n\t// Panics in any code below will be handled by the above.\n\tpanic(\"AHHHH!!\")\n}\n```\n\nThis will capture and report the call stack of the panic, including the site\nof the function that handled the panic.  Do note that Go does not unwind the\ncallstack while processing panics, so the trace will include any functions\nthat may be called by `method` in the example above leading up to the panic.\n\nThis SDK will handle panic messages that are any of the types: `string`,\n`error`, or anything that implements [fmt.Stringer](https://golang.org/pkg/fmt/#Stringer)\nor [fmt.GoStringer](https://golang.org/pkg/fmt/#GoStringer).\n\nWhile the above example uses `client.TrackException`, you can also use the\nlonger form as in earlier examples -- and not only for panics:\n\n```go\nvalue, err := someMethod(argument)\nif err != nil {\n\texception := apmz.NewExceptionTelemetry(err)\n\t\n\t// Set the severity level -- perhaps this isn't a critical\n\t// issue, but we'd *really rather* it didn't fail:\n\texception.SeverityLevel = apmz.Warning\n\t\n\t// One could tweak the number of stack frames to skip by\n\t// reassigning the callstack -- for instance, if you were to\n\t// log this exception in a helper method.\n\texception.Frames = apmz.GetCallstack(3 /* frames to skip */)\n\t\n\t// Properties are available as usual\n\texception.Properties[\"input\"] = argument\n\t\n\t// Track the exception\n\tclient.Track(exception)\n}\n```\n\n### Availability\n[Availability telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#AvailabilityTelemetry)\nrepresent the result of executing an availability test.  This is useful if\nyou are writing availability monitors in Go.\n\n```go\navailability := apmz.NewAvailabilityTelemetry(\"test name\", callDuration, true /* success */)\n\n// The run location indicates where the test was run from\navailability.RunLocation = \"Phoenix\"\n\n// Diagnostics message\navailability.Message = diagnostics\n\n// Id is used for correlation with the target service\navailability.Id = requestId\n\n// Timestamp and duration can be changed through MarkTime, similar\n// to other telemetry types with Duration's\navailability.MarkTime(testStartTime, testEndTime)\n\n// Submit the telemetry\nclient.Track(availability)\n```\n\n### Page Views\n[Page view telemetry items](https://godoc.org/github.com/devigned/apmz-sdk/apmz#PageViewTelemetry)\nrepresent generic actions on a page like a button click.  These are typically\ngenerated by the client side rather than the server side, but is available\nhere nonetheless.\n\n```go\npageview := apmz.NewPageViewTelemetry(\"Event name\", \"http://testuri.org/page\")\n\n// A duration is available here.\npageview.Duration = time.Minute\n\n// As are the usual Properties and Measurements...\n\n// Track\nclient.Track(pageview)\n```\n\n### Context tags\nTelemetry items all have a `Tags` property that contains information *about*\nthe submitted telemetry, such as user, session, and device information.  The\n`Tags` property is an instance of the\n[contracts.ContextTags](https://godoc.org/github.com/devigned/apmz-sdk/apmz/contracts/#ContextTags)\ntype, which is a `map[string]string` under the hood, but has helper methods\nto access the most commonly used data.  An instance of\n[TelemetryContext](https://godoc.org/github.com/devigned/apmz-sdk/apmz/#TelemetryContext)\nexists on the `TelemetryClient`, and also contains a `Tags` property.  These\ntags are applied to all telemetry sent through the client.  If a context tag\nis found on both the client's `TelemetryContext` and in the telemetry item's\n`Tags`, the value associated with the telemtry takes precedence.\n\nA few examples for illustration:\n\n```go\nimport (\n\t\"os\"\n\t\n\t\"github.com/devigned/apmz-sdk/apmz\"\n\t\"github.com/devigned/apmz-sdk/apmz/contracts\"\n)\n\nfunc main() {\n\tclient := apmz.NewTelemetryClient(\"\u003cikey\u003e\")\n\t\n\t// Set role instance name globally -- this is usually the\n\t// name of the service submitting the telemetry\n\tclient.Context().Tags.Cloud().SetRole(\"my_go_server\")\n\t\n\t// Set the role instance to the host name.  Note that this is\n\t// done automatically by the SDK.\n\tclient.Context().Tags.Cloud().SetRoleInstance(os.Hostname())\n\t\n\t// Make a request to fiddle with the telemetry's context\n\treq := apmz.NewRequestTelemetry(\"GET\", \"http://server/path\", time.Millisecond, \"200\")\n\t\n\t// Set the account ID context tag, for this telemetry item\n\t// only.  The following are equivalent:\n\treq.Tags.User().SetAccountId(\"\u003cuser account retrieved from request\u003e\")\n\treq.Tags[contracts.UserAccountId] = \"\u003cuser account retrieved from request\u003e\"\n\t\n\t// This request will have all context tags above.\n\tclient.Track(req)\n}\n```\n\n### Common properties\n\nIn the same way that context tags can be written to all telemetry items, the\n`TelemetryContext` has a `CommonProperties` map.  Entries in this map will\nbe added to all telemetry items' custom properties (unless a telemetry item\nalready has that property set -- the telemetry item always has precedence). \nThis is useful for contextual data that may not be captured in the context\ntags, for instance cluster identifiers or resource groups.\n\n```go\nfunc main() {\n\tclient := apmz.NewTelemetryClient(\"\u003cikey\u003e\")\n\t\n\tclient.Context().CommonProperties[\"Resource group\"] = \"My resource group\"\n\t// ...\n}\n```\n\n### Shutdown\nThe Go SDK submits data asynchronously.  The [InMemoryChannel](https://godoc.org/github.com/devigned/apmz-sdk/apmz/#InMemoryChannel)\nlaunches its own goroutine used to accept and send telemetry.  If you're not\ncareful, this may result in lost telemetry when the service needs to shut\ndown.  The channel has a few methods to deal with this case:\n\n* `Flush` will trigger telemetry submission for buffered items.  It returns\n  immediately and telemetry is not guaranteed to have been sent.\n* `Stop` will immediately shut down the channel and discard any unsubmitted\n  telemetry.  Useful if you need to exit NOW.\n* `Close` will cause the channel to stop accepting new telemetry, submit any\n  pending telemetry, and returns a channel that closes when the telemetry\n  buffer is fully empty.  If telemetry submission fails, then `Close` will\n  retry until the specified duration elapses.  If no duration is specified,\n  then it will give up if any telemetry submission fails.\n\nIf at all possible, you should use `Close`:\n\n```go\nfunc main() {\n\tclient := appinsights.NewTelemetryClient(\"\u003cikey\u003e\")\n\t\n\t// ... run the service ...\n\t\n\t// on shutdown:\n\t\n\tselect {\n\tcase \u003c-client.Channel().Close(10 * time.Second):\n\t\t// Ten second timeout for retries.\n\t\t\n\t\t// If we got here, then all telemetry was submitted\n\t\t// successfully, and we can proceed to exiting.\n\tcase \u003c-time.After(30 * time.Second):\n\t\t// Thirty second absolute timeout.  This covers any\n\t\t// previous telemetry submission that may not have\n\t\t// completed before Close was called.\n\t\t\n\t\t// There are a number of reasons we could have\n\t\t// reached here.  We gave it a go, but telemetry\n\t\t// submission failed somewhere.  Perhaps old events\n\t\t// were still retrying, or perhaps we're throttled.\n\t\t// Either way, we don't want to wait around for it\n\t\t// to complete, so let's just exit.\n\t}\n}\n```\n\nWe recommend something similar to the above to minimize lost telemetry\nthrough shutdown.\n[The documentation](https://godoc.org/github.com/devigned/apmz-sdk/apmz#TelemetryChannel)\nexplains in more detail what can lead to the cases above.\n\n### Diagnostics\nIf you find yourself missing some of the telemetry that you thought was\nsubmitted, diagnostics can be turned on to help troubleshoot problems with\ntelemetry submission.\n\n```go\nappinsights.NewDiagnosticsMessageListener(func(msg string) error {\n\tfmt.Printf(\"[%s] %s\\n\", time.Now().Format(time.UnixDate), msg)\n\treturn nil\n})\n\n// go about your business...\n```\n\nThe SDK will emit messages during every telemetry submission.  Successful\nsubmissions will look something like this:\n\n```\n[Tue Nov 21 18:59:41 PST 2017] --------- Transmitting 16 items ---------\n[Tue Nov 21 18:59:41 PST 2017] Telemetry transmitted in 708.382896ms\n[Tue Nov 21 18:59:41 PST 2017] Response: 200\n```\n\nIf telemetry is rejected, the errors from the data collector endpoint will\nbe displayed:\n\n```\n[Tue Nov 21 18:58:39 PST 2017] --------- Transmitting 16 items ---------\n[Tue Nov 21 18:58:40 PST 2017] Telemetry transmitted in 1.034608896s\n[Tue Nov 21 18:58:40 PST 2017] Response: 206\n[Tue Nov 21 18:58:40 PST 2017] Items accepted/received: 15/16\n[Tue Nov 21 18:58:40 PST 2017] Errors:\n[Tue Nov 21 18:58:40 PST 2017] #9 - 400 109: Field 'name' on type 'RemoteDependencyData' is required but missing or empty. Expected: string, Actual:\n[Tue Nov 21 18:58:40 PST 2017] Telemetry item:\n        {\"ver\":1,\"name\":\"Microsoft.ApplicationInsights.RemoteDependency\",\"time\":\"2017-11-22T02:58:39Z\",\"sampleRate\":100,\"seq\":\"\",\"iKey\":\"\u003cikey\u003e\",\"tags\":{\"ai.cloud.roleInstance\":\"\u003chostname\u003e\",\"ai.device.id\":\"\u003chostname\u003e\",\"ai.device.osVersion\":\"linux\",\"ai.internal.sdkVersion\":\"go:0.4.0-pre\",\"ai.operation.id\":\"bf755161-7725-490c-872e-69815826a94c\"},\"data\":{\"baseType\":\"RemoteDependencyData\",\"baseData\":{\"ver\":2,\"name\":\"\",\"id\":\"\",\"resultCode\":\"\",\"duration\":\"0.00:00:00.0000000\",\"success\":true,\"data\":\"\",\"target\":\"http://bing.com\",\"type\":\"HTTP\"}}}\n\n[Tue Nov 21 18:58:40 PST 2017] Refusing to retry telemetry submission (retry==false)\n```\n\nInformation about retries, server throttling, and more from the SDK's\nperspective will also be available.\n\nPlease include this diagnostic information (with ikey's blocked out) when\nsubmitting bug reports to this project.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevigned%2Fapmz-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevigned%2Fapmz-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevigned%2Fapmz-sdk/lists"}