{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/comments/29559927","id":29559927,"diff_hunk":"@@ -0,0 +1,342 @@\n+package com.microsoft.applicationinsights.azuretest;\n+\n+import com.microsoft.azure.storage.CloudStorageAccount;\n+import com.microsoft.azure.storage.blob.CloudBlobClient;\n+import com.microsoft.azure.storage.blob.CloudBlockBlob;\n+import com.microsoft.azure.storage.queue.CloudQueue;\n+import com.microsoft.azure.storage.queue.CloudQueueClient;\n+import com.microsoft.azure.storage.queue.CloudQueueMessage;\n+import org.apache.commons.lang3.time.StopWatch;\n+import org.json.JSONArray;\n+import org.json.JSONException;\n+import org.json.JSONObject;\n+import org.junit.Test;\n+\n+import javax.xml.bind.JAXBException;\n+import java.net.HttpURLConnection;\n+import java.net.URI;\n+import java.net.URISyntaxException;\n+import java.util.ArrayList;\n+import java.util.Hashtable;\n+import java.util.Map;\n+import java.util.UUID;\n+\n+/**\n+ * Created by moralt on 30/4/2015.\n+ */\n+public class CompareTelemetryWithAzureExportTests {\n+    String runId = UUID.randomUUID().toString();\n+    String configEnvironmentVariable = \"INTEGRATION_TEST_CONFIGURATION\";\n+    IntegrationTestConfiguration config;\n+    private static final int millisecondsInSecond = 1000;\n+\n+    /**\n+     * Sends GET requests to server and expects to get similar result from app insights\n+     * @throws Exception\n+     */\n+    @Test\n+    public void sendHttpRequestTest() throws Exception {\n+\n+        initConfiguration();\n+        clearQueue();\n+\n+        ArrayList<TelemetryItem> expectedTelemetries = sentHttpGetRequests();\n+        ArrayList<TelemetryItem> realTelemetries = getTelemetryFromAzure(DocumentType.Requests);\n+\n+        ArrayList<TelemetryItem> missingTelemetry = getMissingExpectedTelemetry(realTelemetries, expectedTelemetries);\n+        if (missingTelemetry.size() > 0) {\n+            for (TelemetryItem item : missingTelemetry) {\n+                System.out.println(\"Didn't find matching item in real telemetry for request of URI \" + item.getProperty(\"uri\"));\n+            }\n+\n+            throw new Exception(\"Didn't find match for \" + missingTelemetry.size() + \" items\");\n+        }\n+        else {\n+            System.out.println(\"Test passed successfully\");\n+        }\n+    }\n+\n+    private void initConfiguration() throws JAXBException {\n+        String location = System.getenv(configEnvironmentVariable);\n+        Map<String, String> env =  System.getenv();\n+        System.out.println(\"Configuration file located in \" + location);\n+\n+        try {\n+           config = IntegrationTestConfiguration.load(location);\n+        }\n+        catch(JAXBException e) {\n+            System.out.println(\"Failed to load configuration file \" + location);\n+            throw e;\n+        }\n+    }\n+\n+    /**\n+     * Clears the Azure queue from all existing messages\n+     * @throws Exception\n+     */\n+    private void clearQueue() throws Exception {\n+        CloudStorageAccount account = CloudStorageAccount.parse(config.getStorageConnectionString());\n+        CloudQueueClient queueClient = account.createCloudQueueClient();\n+        CloudQueue queue = queueClient.getQueueReference(config.getQueueName());\n+\n+        queue.downloadAttributes();\n+        System.out.println(\"Before clearing: Queue contains \" + queue.getApproximateMessageCount() + \" items\");\n+        System.out.println(\"Clearing queue ...\");\n+        queue.clear();\n+    }\n+\n+    private ArrayList<TelemetryItem> sentHttpGetRequests() throws Exception {\n+\n+        String serverAddress = config.getTestServerAddress();\n+        int tomcat7Port = config.getTomcat7Port();\n+        String applicationFollder = config.getApplicationFolder();\n+\n+        String requestId1 = UUID.randomUUID().toString();\n+        String requestId2 = UUID.randomUUID().toString();\n+        String requestId3 = UUID.randomUUID().toString();\n+\n+        URI uri1 = new URI(\"http://\" + serverAddress + \":\" + tomcat7Port + \"/\" + applicationFollder + \"/books?id=Thriller&runId=\" + runId + \"&requestId=\" + requestId1);\n+        URI uri2 = new URI(\"http://\" + serverAddress + \":\" + tomcat7Port + \"/\" + applicationFollder + \"/loan?title=Gone%20Girl&id=030758836x&subject=Thriller&runId=\" + runId + \"&requestId=\" + requestId2);\n+        URI uri3 = new URI(\"http://\" + serverAddress + \":\" + tomcat7Port + \"/\" + applicationFollder + \"/notExistingWebFage?runId=\" + runId + \"&requestId=\" + requestId3);\n+\n+        TelemetryItem expectedTelemetry1 = sendGet(uri1, requestId1);\n+        TelemetryItem expectedTelemetry2 = sendGet(uri2, requestId2);\n+        TelemetryItem expectedTelemetry3 = sendGet(uri3, requestId3);\n+\n+        ArrayList<TelemetryItem> expectedTelemetries = new ArrayList<TelemetryItem>();\n+        expectedTelemetries.add(expectedTelemetry1);\n+        expectedTelemetries.add(expectedTelemetry2);\n+        expectedTelemetries.add(expectedTelemetry3);\n+\n+        return expectedTelemetries;\n+    }\n+\n+    /**\n+     * Sends HTTP GET request and returns the expected telemetry from AppInsights\n+     * @param uri The URI for the request\n+     * @return The expected telemetry items from AppInsights\n+     * @throws Exception\n+     */\n+    private TelemetryItem sendGet(URI uri, String requestId) throws Exception {\n+        HttpURLConnection connection = (HttpURLConnection) uri.toURL().openConnection();\n+\n+        // optional default is GET\n+        connection.setRequestMethod(\"GET\");\n+\n+        //add request header\n+        connection.setRequestProperty(\"User-Agent\", config.getUserAgent());\n+\n+        System.out.println(\"Sending 'GET' request to URL: \" + uri.toString());\n+        Integer responseCode = connection.getResponseCode();\n+        System.out.println(\"Response Code : \" + responseCode);\n+\n+        // Create expected result\n+        TelemetryItem expectedResult = new TelemetryItem(DocumentType.Requests, requestId);\n+        expectedResult.setProperty(\"port\", Integer.toString(uri.getPort()));\n+        expectedResult.setProperty(\"responseCode\", responseCode.toString());\n+        expectedResult.setProperty(\"uri\", uri.toString());\n+        expectedResult.setProperty(\"userAgent\", config.getUserAgent());\n+\n+        try {\n+            String[] params = uri.getQuery().split(\"&\");\n+            for (String param : params) {\n+                String name = param.split(\"=\")[0];\n+                String value = param.split(\"=\")[1];\n+                expectedResult.setProperty(\"queryParameter.\" + name, value);\n+            }\n+        }\n+        catch (Exception e) {\n+            System.out.println(\"Failed to process query parameters '\" + uri.getQuery() + \"'. Ignoring.\");\n+        }\n+\n+        return expectedResult;\n+    }\n+\n+    /**\n+     * Connects to Azure export and retrieves the telemetry items\n+     * @param docType The document type to retrieve from Azure\n+     * @return The retrieved telemetry items\n+     * @throws Exception\n+     */\n+    private ArrayList<TelemetryItem> getTelemetryFromAzure(DocumentType docType) throws Exception {\n+        System.out.println(\"Creating Azure storage account connection\");\n+        CloudStorageAccount account = CloudStorageAccount.parse(config.getStorageConnectionString());\n+        CloudBlobClient blobClient = account.createCloudBlobClient();\n+\n+        System.out.println(\"Creating Azure queue connection\");\n+        CloudQueueClient queueClient = account.createCloudQueueClient();\n+        CloudQueue queue = queueClient.getQueueReference(config.getQueueName());\n+\n+        ArrayList<JSONObject> telemetryAsJson = new ArrayList<JSONObject>();\n+        StopWatch stopWatch = new StopWatch();\n+\n+        System.out.println(\"Starting to poll the queue for \" + config.getSecondsToPoll() + \"seconds ...\");\n+        stopWatch.start();\n+\n+        while (stopWatch.getTime() < config.getSecondsToPoll() * millisecondsInSecond) {\n+            System.out.println(stopWatch.getTime() / millisecondsInSecond + \" seconds passed. Got \" + telemetryAsJson.size() + \" items so far.\");\n+\n+            ArrayList<CloudQueueMessage> messages = (ArrayList<CloudQueueMessage>)\n+                    queue.retrieveMessages(config.getNumberOfMessagesToRetrieve(), config.getSecondsToPoll(), null, null);\n+            ArrayList<String> blobUris = getBlobUrisFromQueueMessages(docType, messages);\n+            for (String blobUri : blobUris) {\n+                CloudBlockBlob blob = new CloudBlockBlob(new URI(blobUri), blobClient);\n+                ArrayList<JSONObject> jsonsFromBlobContent = getJsonsFromString(blob.downloadText());\n+                telemetryAsJson.addAll(jsonsFromBlobContent);\n+            }\n+\n+            if (messages.size() < config.getNumberOfMessagesToRetrieve()){\n+                Helpers.sleep(config.getSecondsToSleep() * millisecondsInSecond);\n+            }\n+        }\n+\n+        ArrayList<TelemetryItem> telemetryItems = new ArrayList<TelemetryItem>();\n+        for (JSONObject json : telemetryAsJson) {\n+            telemetryItems.add(getTelemetryItemFromJson(docType, json));\n+        }\n+\n+        return telemetryItems;\n+    }\n+\n+    /**\n+     * Gets a list of blob URIs from Azure queue messages\n+     * @param docType The document type to retrieve from Azure\n+     * @param messages The Azure queue messages\n+     * @return An ArrayList of blob URIs\n+     * @throws Exception\n+     */\n+    private ArrayList<String> getBlobUrisFromQueueMessages(DocumentType docType, ArrayList<CloudQueueMessage> messages) throws Exception {\n+        ArrayList<String> blobUris = new ArrayList<String>();\n+\n+        System.out.println(\"Extracting blob URIs of document type \" + docType.toString() + \" from \" + messages.size() + \" messages\");\n+        for (CloudQueueMessage message : messages) {\n+            JSONObject messageContentAsJson = new JSONObject(message.getMessageContentAsString());\n+            String msgDocType = messageContentAsJson.getString(\"DocumentType\");\n+\n+            if(msgDocType.equals(docType.toString())) {\n+                blobUris.add(messageContentAsJson.getString(\"BlobUri\"));\n+            }\n+        }\n+\n+        System.out.println(\"Got \" + blobUris.size() + \" blob URIs with document type \" + docType.toString());\n+        return blobUris;\n+    }\n+\n+    /**\n+     * Converts a string to multiple JSON objects\n+     * @param jString The string to convert\n+     * @return ArrayList of JSON objects\n+     */\n+    private ArrayList<JSONObject> getJsonsFromString(String jString) throws JSONException {\n+        System.out.println(\"Extracting JSON objects from string\");\n+        String[] jsonStrings = jString.split(\"\\n\");\n+        ArrayList<JSONObject> jsonObjects = new ArrayList<JSONObject>();\n+\n+        for(String s : jsonStrings) {\n+            jsonObjects.add(new JSONObject(s));\n+        }\n+\n+        System.out.println(\"Got \" + jsonObjects.size() + \" JSON objects\");\n+        return jsonObjects;\n+    }\n+\n+    /**\n+     * Converts JSON object to TelemetryItem by it's document type\n+     * @param docType The document type of the telemetry\n+     * @param json The JSON object\n+     * @return A TelemetryItem\n+     * @throws Exception\n+     */\n+    private TelemetryItem getTelemetryItemFromJson(DocumentType docType, JSONObject json) throws Exception {\n+        if (docType == DocumentType.Requests) {\n+            return getRequestTelemetryItemFromJson(json);\n+        }\n+\n+        if (docType == DocumentType.PerformanceCounters) {\n+            return getPerformanceCounterTelemetryItemFromJson(json);\n+        }\n+\n+        throw new Exception(\"Can't find document type: \" + docType.toString());\n+    }\n+\n+    /**\n+     * Converts JSON object to Request TelemetryItem\n+     * @param json The JSON object\n+     * @return A TelemetryItem\n+     */\n+    private TelemetryItem getRequestTelemetryItemFromJson(JSONObject json) throws URISyntaxException, JSONException {\n+        System.out.println(\"Converting JSON object to telemetry item with document type \" + DocumentType.Requests.toString());\n+        String address       = json.getJSONArray(\"request\").getJSONObject(0).getString(\"url\");\n+        Integer port         = json.getJSONArray(\"request\").getJSONObject(0).getJSONObject(\"urlData\").getInt(\"port\");\n+        Integer responseCode = json.getJSONArray(\"request\").getJSONObject(0).getInt(\"responseCode\");\n+        String userAgent     = json.getJSONObject(\"context\").getJSONObject(\"device\").getString(\"userAgent\");\n+\n+        JSONArray parameters = json.getJSONArray(\"request\").getJSONObject(0).getJSONObject(\"urlData\").getJSONArray(\"queryParameters\");\n+        Hashtable<String, String> queryParameters = new Hashtable<String, String>();\n+        for (int i = 0; i < parameters.length(); ++i) {\n+            String name  = parameters.getJSONObject(i).getString(\"parameter\");","path":"web/src/integTest/java/com/microsoft/applicationinsights/azuretest/CompareTelemetryWithAzureExportTests.java","position":277,"original_position":277,"commit_id":"add8367d81b37f4feda2bc4e903f05acb9524226","original_commit_id":"add8367d81b37f4feda2bc4e903f05acb9524226","user":{"login":"amnonshmsft","id":10062845,"avatar_url":"https://avatars.githubusercontent.com/u/10062845?v=3","gravatar_id":"","url":"https://api.github.com/users/amnonshmsft","html_url":"https://github.com/amnonshmsft","followers_url":"https://api.github.com/users/amnonshmsft/followers","following_url":"https://api.github.com/users/amnonshmsft/following{/other_user}","gists_url":"https://api.github.com/users/amnonshmsft/gists{/gist_id}","starred_url":"https://api.github.com/users/amnonshmsft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amnonshmsft/subscriptions","organizations_url":"https://api.github.com/users/amnonshmsft/orgs","repos_url":"https://api.github.com/users/amnonshmsft/repos","events_url":"https://api.github.com/users/amnonshmsft/events{/privacy}","received_events_url":"https://api.github.com/users/amnonshmsft/received_events","type":"User","site_admin":false},"body":"Please store `parameters.getJSONObject(i)` in a local variable and give it a meaningful name","created_at":"2015-05-03T20:31:24Z","updated_at":"2015-05-03T20:31:24Z","html_url":"https://github.com/Microsoft/ApplicationInsights-Java/pull/175#discussion_r29559927","pull_request_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/comments/29559927"},"html":{"href":"https://github.com/Microsoft/ApplicationInsights-Java/pull/175#discussion_r29559927"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175","id":34517949,"html_url":"https://github.com/Microsoft/ApplicationInsights-Java/pull/175","diff_url":"https://github.com/Microsoft/ApplicationInsights-Java/pull/175.diff","patch_url":"https://github.com/Microsoft/ApplicationInsights-Java/pull/175.patch","issue_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/175","number":175,"state":"open","locked":false,"title":"Integration test framework using AppInsights export to azure storage","user":{"login":"moralt","id":11911019,"avatar_url":"https://avatars.githubusercontent.com/u/11911019?v=3","gravatar_id":"","url":"https://api.github.com/users/moralt","html_url":"https://github.com/moralt","followers_url":"https://api.github.com/users/moralt/followers","following_url":"https://api.github.com/users/moralt/following{/other_user}","gists_url":"https://api.github.com/users/moralt/gists{/gist_id}","starred_url":"https://api.github.com/users/moralt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/moralt/subscriptions","organizations_url":"https://api.github.com/users/moralt/orgs","repos_url":"https://api.github.com/users/moralt/repos","events_url":"https://api.github.com/users/moralt/events{/privacy}","received_events_url":"https://api.github.com/users/moralt/received_events","type":"User","site_admin":false},"body":"Integration tests framework currently sends http requests and compares the results from Application Insights - Export with the expected results.","created_at":"2015-05-01T02:36:58Z","updated_at":"2015-05-03T20:31:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"628d8c1a3e96310aaebc40d5fa834d97bd94c5d0","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175/commits","review_comments_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175/comments","review_comment_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/175/comments","statuses_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/statuses/add8367d81b37f4feda2bc4e903f05acb9524226","head":{"label":"Microsoft:features/integration_test_framework","ref":"features/integration_test_framework","sha":"add8367d81b37f4feda2bc4e903f05acb9524226","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":27460436,"name":"ApplicationInsights-Java","full_name":"Microsoft/ApplicationInsights-Java","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/ApplicationInsights-Java","description":"Application Insights SDK for Java","fork":false,"url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java","forks_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/forks","keys_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/teams","hooks_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/events","assignees_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/tags","blobs_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/languages","stargazers_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/subscription","commits_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/merges","archive_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/downloads","issues_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/releases{/id}","created_at":"2014-12-03T00:13:22Z","updated_at":"2015-04-29T17:10:25Z","pushed_at":"2015-05-03T06:15:13Z","git_url":"git://github.com/Microsoft/ApplicationInsights-Java.git","ssh_url":"git@github.com:Microsoft/ApplicationInsights-Java.git","clone_url":"https://github.com/Microsoft/ApplicationInsights-Java.git","svn_url":"https://github.com/Microsoft/ApplicationInsights-Java","homepage":"http://azure.microsoft.com/en-us/services/application-insights/","size":5029,"stargazers_count":5,"watchers_count":5,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":8,"forks":3,"open_issues":8,"watchers":5,"default_branch":"master"}},"base":{"label":"Microsoft:master","ref":"master","sha":"be0466791dffed9f69dbc689fa08cbd12d569fcb","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":27460436,"name":"ApplicationInsights-Java","full_name":"Microsoft/ApplicationInsights-Java","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars.githubusercontent.com/u/6154722?v=3","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/ApplicationInsights-Java","description":"Application Insights SDK for Java","fork":false,"url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java","forks_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/forks","keys_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/teams","hooks_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/events","assignees_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/tags","blobs_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/languages","stargazers_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/subscription","commits_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/merges","archive_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/downloads","issues_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/releases{/id}","created_at":"2014-12-03T00:13:22Z","updated_at":"2015-04-29T17:10:25Z","pushed_at":"2015-05-03T06:15:13Z","git_url":"git://github.com/Microsoft/ApplicationInsights-Java.git","ssh_url":"git@github.com:Microsoft/ApplicationInsights-Java.git","clone_url":"https://github.com/Microsoft/ApplicationInsights-Java.git","svn_url":"https://github.com/Microsoft/ApplicationInsights-Java","homepage":"http://azure.microsoft.com/en-us/services/application-insights/","size":5029,"stargazers_count":5,"watchers_count":5,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":8,"forks":3,"open_issues":8,"watchers":5,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175"},"html":{"href":"https://github.com/Microsoft/ApplicationInsights-Java/pull/175"},"issue":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/175"},"comments":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/issues/175/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/pulls/175/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/ApplicationInsights-Java/statuses/add8367d81b37f4feda2bc4e903f05acb9524226"}}}}