{"action":"created","comment":{"url":"https://api.github.com/repos/kaaproject/kaa/pulls/comments/68964910","id":68964910,"diff_hunk":"@@ -5,4 +5,1175 @@ permalink: /:path/\n nav: /:path/Programming-guide/Key-platform-features/Data-collection\n sort_idx: 50\n ---\n-Purpose of data collection. Schemas and versioning. Store and forward (EP-side caching). Log appenders. Reliability. Sequencing. SDK-side API, log storage, log upload triggers. Avro wrapper schema.\n+\n+{% assign root_url = page.url | split: '/'%}\n+{% capture root_url  %} /{{root_url[1]}}/{{root_url[2]}}/{% endcapture %}\n+\n+* TOC\n+{:toc}\n+\n+The Kaa data collection subsystem is designed to collect records (logs) of pre-configured structure on the endpoints, periodically transferring these records\n+from endpoints to Operation services, and, finally, either persisting them on the server for further processing or submitting them to immediate stream\n+analysis. The log structure in Kaa is determined for each application by a configurable log schema. On the Operation service side, there are log appenders\n+which are responsible for writing logs received by the Operations service into the specific storage.\n+\n+From this guide you will learn how to use the Kaa data collection subsystem.\n+\n+# Basic architecture\n+\n+The following diagram illustrates basic entities and data flows in scope of the data collection management:\n+\n+* The data from the endpoints (logs) is collected and transferred to the server in the format as defined by the [log schema](#log-schema) \n+created by the developer for the application\n+* Log appenders submit the logs received by the server to a particular storage or analytics system\n+\n+![Basic data collection management](attach/basic-data-collection-management.png) <br/>\n+\n+The Kaa Data collection subsystem provides the following features:\n+\n+* Generation of the logging model and related API calls in the endpoint SDK\n+* Enforcement of data integrity and validity\n+* Efficient delivery of logs to Operations services\n+* Storing log contents by means of the log appenders configured for the application\n+\n+The application developer is responsible for designing the log schema and invoking the endpoint logging API from the client application.\n+\n+# Log schema\n+\n+The log schema is fully compatible with the [Apache Avro schema](http://avro.apache.org/docs/current/spec.html#schemas). There is one log schema defined \n+by default for each Kaa application. This schema supports versioning, therefore, whenever a new log schema is configured on the Kaa service for the application,\n+this new schema gets a new sequence version assigned. The Kaa service maintains compatibility with the older versions of the log schema to ensure proper\n+functioning of the clients that for some reason are not yet upgraded to the latest schema version.\n+\n+The following examples illustrate basic log schemas.\n+\n+* The simplest definition of a log record with no data fields (mostly useless):\n+\n+```json\n+{  \n+    \"name\":\"EmptyLog\",  \n+    \"namespace\":\"org.kaaproject.sample\",  \n+    \"type\":\"record\",  \n+    \"fields\":[\n+    ]\n+}\n+```\n+\n+* A simple log schema with the log level, tag, and message:\n+\n+```json\n+{\n+    \"name\":\"LogData\",\n+    \"namespace\":\"org.kaaproject.sample\",\n+    \"type\":\"record\",\n+    \"fields\":[\n+        {\n+            \"name\":\"level\",\n+            \"type\":{\n+                \"type\":\"enum\",\n+                \"name\":\"Level\",\n+                \"symbols\":[\n+                    \"DEBUG\",\n+                    \"ERROR\",\n+                    \"FATAL\",\n+                    \"INFO\",\n+                    \"TRACE\",\n+                    \"WARN\"\n+                ]\n+            }\n+        },\n+        {\n+            \"name\":\"tag\",\n+            \"type\":\"string\"\n+        },\n+        {\n+            \"name\":\"message\",\n+            \"type\":\"string\"\n+        }\n+    ]\n+}\n+```\n+\n+## Adding log schema\n+\n+The default log schema installed for Kaa applications is empty. You can configure your own log schema using the Admin UI or\n+[Admin REST API]({{root_url}}Programming-guide/Server-REST-APIs/ #TODO).\n+For the purpose of this guide, we will use schema that is very close to the common log structure:\n+* log level\n+* tag\n+* message\n+\n+```json\n+{\n+    \"type\":\"record\",\n+    \"name\":\"LogData\",\n+    \"namespace\":\"org.kaaproject.kaa.schema.sample.logging\",\n+    \"fields\":[\n+        {\n+            \"name\":\"level\",\n+            \"type\":{\n+                \"type\":\"enum\",\n+                \"name\":\"Level\",\n+                \"symbols\":[\n+                    \"DEBUG\",\n+                    \"ERROR\",\n+                    \"FATAL\",\n+                    \"INFO\",\n+                    \"TRACE\",\n+                    \"WARN\"\n+                ]\n+            }\n+        },\n+        {\n+            \"name\":\"tag\",\n+            \"type\":\"string\"\n+        },\n+        {\n+            \"name\":\"message\",\n+            \"type\":\"string\"\n+        }\n+    ]\n+}\n+```\n+\n+In Admin UI as a tenant developer, you can create new log schemas for the application as follows:\n+\n+1. In the Log schemas window for the application, click Add schema.\n+2. In the Add log schema window, create a log schema either by using the [schema form]({{root_url}}LINK_TO_AVRO_UI_FORMS_AVRO_UI_SCHEMA_FORM) or\n+by uploading a schema in the [Avro](http://avro.apache.org/docs/current/spec.html) format from a file.<br/>\n+\n+![Add log schema](attach/add-log-schema.png) <br/>\n+\n+3. Click Add to save the schema.\n+\n+If you want to review the added Avro schema, open the Log schema details window by clicking the schema in the Log schemas window.\n+\n+![Log schema details](attach/log_schema_details.png)\n+\n+# Log appenders\n+\n+A log appender is a service utility which resides on the Operations service. This utility is responsible for writing logs (received by the Operations service\n+from endpoints) to a single specific storage, as defined by the log appender's type. Kaa provides several default implementations of log appenders but\n+it is also possible to create custom log appenders.\n+\n+## Confirm delivery option\n+\n+By design every Kaa client stores logs in a log storage before sending them to the Kaa node. By default, upon receiving the logs, the corresponding\n+log appender on the Kaa node sends the delivery confirmation back to the Kaa client. If the delivery was successful, the Kaa client deletes the log copies\n+from its local storage, otherwise - it receives an appropriate error code and either restarts the operation of log delivery or attempts to deliver\n+the same data to a different Kaa node.\n+\n+The confirm delivery option adds to a log appender the capability to verify whether received logs have been written into actual storage\n+before sending the confirmation to the Kaa client.\n+\n+To illustrate, let’s consider the following scenarios:\n+\n+1. Log appender A has been configured with the confirm delivery option enabled. The Kaa client will receive a message about successful logs delivery\n+only after the Kaa node successfully receives and writes the logs into an external storage. If the Kaa node fails to write the logs into the storage,\n+the Kaa client will send the logs again. If there are more than one log appender with the enabled confirm delivery option then the Kaa client will receive\n+a message about successful logs delivery only after each log appender successfully writes its logs into the storage.\n+2. Log appender A has been configured with the confirm delivery option disabled. The Kaa client will receive a message about successful logs delivery\n+to the Kaa node but if the Kaa node fails to write the logs into an external storage system, the Kaa client will not be informed about the failure and\n+will not attempt sending the logs again. As a result, the logs will be lost.\n+3. Log appender A has been configured with the confirm delivery option enabled and log appender B with the disabled one. The Kaa client will receive\n+a message about successful logs delivery as soon as log appender A confirms delivery. Any errors that might happen when log appender B writes its logs into\n+the storage will not be taken into account.\n+\n+To summarize, the confirm delivery option allows you to have the guaranteed delivery of every log record to the external storage.\n+\n+Also, it is worth noting that by default an inmemory log storage is used on the Kaa client. This means that you can lose your undelivered data in case of\n+an endpoint reset. To avoid this, use a persistent log storage to store all the data that was not yet confirmed as delivered.\n+\n+## Existing log appender implementations\n+\n+There are several default log appender implementations that are available out of the box for each Kaa installation. A Kaa developer is able to add, update\n+and delete log appenders using Admin UI or Admin REST API. After adding log appender please [configure your application](#data-collection-sdk-api) or use\n+[data collection demo](#data-collection-demo) application for log delivery. For more information about architecture, configuration and administration refer\n+to the corresponding log appender:\n+\n+* ### [Cassandra log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Cassandra-log-appender)\n+\n+The Cassandra log appender is responsible for transferring logs from the Operations service to the [Cassandra](http://cassandra.apache.org/) database.\n+You can flexibly configure Cassandra storage (Cassandra nodes, authentication credentials, keyspace name, table name, column mapping, clustering, see\n+[configuration]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Cassandra-log-appender/#configuration) section).\n+\n+* ### [Couchbase log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Couchbase-log-appender)\n+\n+The Couchbase log appender is responsible for transferring logs from the Operations service to the [Couchbase](http://www.couchbase.com/) database. You can\n+configure Couchbase servers list, bucket name and password.\n+\n+* ### [File system log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/File-system-log-appender)\n+\n+The file system log appender stores received logs into the local file system of the Operations service. This log appender may be used for test purposes\n+or in pair with tools like Flume and others. You can configure logs root path, rolling file name pattern, rolling max history, trigger max file size and\n+[other]({{root_url}}Programming-guide/Key-platform-features/Data-collection/File-system-log-appender/#configuration) parameters for this log appender.\n+\n+* ### [Flume log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Flume-log-appender)\n+\n+The Flume log appender encapsulates received logs into Flume events and sends these events to external Flume sources via Avro RPC. You can configure\n+flume event format, hosts balancing type, include client-side and/or server-side profile data and\n+[other]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Flume-log-appender/#configuration) parameters for this log appender.\n+\n+* ### [Kafka log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Kafka-log-appender)\n+\n+The Kafka log appender is responsible for transferring logs from the Operations service to the [Apache Kafka](http://kafka.apache.org/) service. The logs are\n+stored in the specified topic. You can configure Kafka bootstrap servers list, topic name, compression type and\n+[other]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Kafka-log-appender/#configuration) parameters for this log appender.\n+\n+* ### [MongoDB log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/MongoDB-log-appender)\n+\n+The MongoDB log appender is responsible for transferring logs from the Operations service to the [MongoDB](https://www.mongodb.com/) database. You can\n+configure MongoDB nodes list, authentication credentials, MongoDB database name and\n+[other]({{root_url}}Programming-guide/Key-platform-features/Data-collection/MongoDB-log-appender/#configuration) parameters for this log appender.\n+The logs are stored in the table named __logs_$[applicationToken]({{root_url}}Glossary)_, where _$[applicationToken]({{root_url}}Glossary)_ matches the token\n+of the current application.\n+\n+* ### [Oracle NoSQL log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Oracle-NoSQL-log-appender)\n+\n+The Oracle NoSQL log appender is responsible for transferring logs from the Operations service to the\n+[Oracle NoSQL](http://www.oracle.com/technetwork/database/database-technologies/nosqldb/overview/index.html) key/value storage. You can configure KVStore name,\n+KVStore nodes and [other]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Oracle-NoSQL-log-appender/#configuration) parameters for this\n+log appender.\n+\n+* ### [Rest log appender]({{root_url}}Programming-guide/Key-platform-features/Data-collection/Rest-log-appender)\n+\n+The REST log appender is responsible for transferring logs from Operation service to your custom service. You can configure host, port, relative URI path,","path":"doc/Programming-guide/Key-platform-features/Data-collection/index.md","position":237,"original_position":237,"commit_id":"011708cdf56bf82e128c6adda55a24838366b3d9","original_commit_id":"011708cdf56bf82e128c6adda55a24838366b3d9","user":{"login":"Slash32","id":19823389,"avatar_url":"https://avatars.githubusercontent.com/u/19823389?v=3","gravatar_id":"","url":"https://api.github.com/users/Slash32","html_url":"https://github.com/Slash32","followers_url":"https://api.github.com/users/Slash32/followers","following_url":"https://api.github.com/users/Slash32/following{/other_user}","gists_url":"https://api.github.com/users/Slash32/gists{/gist_id}","starred_url":"https://api.github.com/users/Slash32/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Slash32/subscriptions","organizations_url":"https://api.github.com/users/Slash32/orgs","repos_url":"https://api.github.com/users/Slash32/repos","events_url":"https://api.github.com/users/Slash32/events{/privacy}","received_events_url":"https://api.github.com/users/Slash32/received_events","type":"User","site_admin":false},"body":"from Operation**s** service","created_at":"2016-06-29T15:13:49Z","updated_at":"2016-06-29T15:13:49Z","html_url":"https://github.com/kaaproject/kaa/pull/746#discussion_r68964910","pull_request_url":"https://api.github.com/repos/kaaproject/kaa/pulls/746","_links":{"self":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/comments/68964910"},"html":{"href":"https://github.com/kaaproject/kaa/pull/746#discussion_r68964910"},"pull_request":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/746"}}},"pull_request":{"url":"https://api.github.com/repos/kaaproject/kaa/pulls/746","id":73510288,"html_url":"https://github.com/kaaproject/kaa/pull/746","diff_url":"https://github.com/kaaproject/kaa/pull/746.diff","patch_url":"https://github.com/kaaproject/kaa/pull/746.patch","issue_url":"https://api.github.com/repos/kaaproject/kaa/issues/746","number":746,"state":"open","locked":false,"title":"KAA-1130: Programming guide -> Data collection","user":{"login":"sashadidukh","id":12672198,"avatar_url":"https://avatars.githubusercontent.com/u/12672198?v=3","gravatar_id":"","url":"https://api.github.com/users/sashadidukh","html_url":"https://github.com/sashadidukh","followers_url":"https://api.github.com/users/sashadidukh/followers","following_url":"https://api.github.com/users/sashadidukh/following{/other_user}","gists_url":"https://api.github.com/users/sashadidukh/gists{/gist_id}","starred_url":"https://api.github.com/users/sashadidukh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sashadidukh/subscriptions","organizations_url":"https://api.github.com/users/sashadidukh/orgs","repos_url":"https://api.github.com/users/sashadidukh/repos","events_url":"https://api.github.com/users/sashadidukh/events{/privacy}","received_events_url":"https://api.github.com/users/sashadidukh/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-06-12T23:05:17Z","updated_at":"2016-06-29T15:13:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c76a1f390517387b1758d137ce857d2daf78982e","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/kaaproject/kaa/pulls/746/commits","review_comments_url":"https://api.github.com/repos/kaaproject/kaa/pulls/746/comments","review_comment_url":"https://api.github.com/repos/kaaproject/kaa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kaaproject/kaa/issues/746/comments","statuses_url":"https://api.github.com/repos/kaaproject/kaa/statuses/011708cdf56bf82e128c6adda55a24838366b3d9","head":{"label":"sashadidukh:feature/KAA-1130","ref":"feature/KAA-1130","sha":"011708cdf56bf82e128c6adda55a24838366b3d9","user":{"login":"sashadidukh","id":12672198,"avatar_url":"https://avatars.githubusercontent.com/u/12672198?v=3","gravatar_id":"","url":"https://api.github.com/users/sashadidukh","html_url":"https://github.com/sashadidukh","followers_url":"https://api.github.com/users/sashadidukh/followers","following_url":"https://api.github.com/users/sashadidukh/following{/other_user}","gists_url":"https://api.github.com/users/sashadidukh/gists{/gist_id}","starred_url":"https://api.github.com/users/sashadidukh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sashadidukh/subscriptions","organizations_url":"https://api.github.com/users/sashadidukh/orgs","repos_url":"https://api.github.com/users/sashadidukh/repos","events_url":"https://api.github.com/users/sashadidukh/events{/privacy}","received_events_url":"https://api.github.com/users/sashadidukh/received_events","type":"User","site_admin":false},"repo":{"id":55413494,"name":"kaa","full_name":"sashadidukh/kaa","owner":{"login":"sashadidukh","id":12672198,"avatar_url":"https://avatars.githubusercontent.com/u/12672198?v=3","gravatar_id":"","url":"https://api.github.com/users/sashadidukh","html_url":"https://github.com/sashadidukh","followers_url":"https://api.github.com/users/sashadidukh/followers","following_url":"https://api.github.com/users/sashadidukh/following{/other_user}","gists_url":"https://api.github.com/users/sashadidukh/gists{/gist_id}","starred_url":"https://api.github.com/users/sashadidukh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sashadidukh/subscriptions","organizations_url":"https://api.github.com/users/sashadidukh/orgs","repos_url":"https://api.github.com/users/sashadidukh/repos","events_url":"https://api.github.com/users/sashadidukh/events{/privacy}","received_events_url":"https://api.github.com/users/sashadidukh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sashadidukh/kaa","description":"Kaa open-source middleware platform for building, managing, and integrating connected products with the Internet of Everything.","fork":true,"url":"https://api.github.com/repos/sashadidukh/kaa","forks_url":"https://api.github.com/repos/sashadidukh/kaa/forks","keys_url":"https://api.github.com/repos/sashadidukh/kaa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sashadidukh/kaa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sashadidukh/kaa/teams","hooks_url":"https://api.github.com/repos/sashadidukh/kaa/hooks","issue_events_url":"https://api.github.com/repos/sashadidukh/kaa/issues/events{/number}","events_url":"https://api.github.com/repos/sashadidukh/kaa/events","assignees_url":"https://api.github.com/repos/sashadidukh/kaa/assignees{/user}","branches_url":"https://api.github.com/repos/sashadidukh/kaa/branches{/branch}","tags_url":"https://api.github.com/repos/sashadidukh/kaa/tags","blobs_url":"https://api.github.com/repos/sashadidukh/kaa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sashadidukh/kaa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sashadidukh/kaa/git/refs{/sha}","trees_url":"https://api.github.com/repos/sashadidukh/kaa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sashadidukh/kaa/statuses/{sha}","languages_url":"https://api.github.com/repos/sashadidukh/kaa/languages","stargazers_url":"https://api.github.com/repos/sashadidukh/kaa/stargazers","contributors_url":"https://api.github.com/repos/sashadidukh/kaa/contributors","subscribers_url":"https://api.github.com/repos/sashadidukh/kaa/subscribers","subscription_url":"https://api.github.com/repos/sashadidukh/kaa/subscription","commits_url":"https://api.github.com/repos/sashadidukh/kaa/commits{/sha}","git_commits_url":"https://api.github.com/repos/sashadidukh/kaa/git/commits{/sha}","comments_url":"https://api.github.com/repos/sashadidukh/kaa/comments{/number}","issue_comment_url":"https://api.github.com/repos/sashadidukh/kaa/issues/comments{/number}","contents_url":"https://api.github.com/repos/sashadidukh/kaa/contents/{+path}","compare_url":"https://api.github.com/repos/sashadidukh/kaa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sashadidukh/kaa/merges","archive_url":"https://api.github.com/repos/sashadidukh/kaa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sashadidukh/kaa/downloads","issues_url":"https://api.github.com/repos/sashadidukh/kaa/issues{/number}","pulls_url":"https://api.github.com/repos/sashadidukh/kaa/pulls{/number}","milestones_url":"https://api.github.com/repos/sashadidukh/kaa/milestones{/number}","notifications_url":"https://api.github.com/repos/sashadidukh/kaa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sashadidukh/kaa/labels{/name}","releases_url":"https://api.github.com/repos/sashadidukh/kaa/releases{/id}","deployments_url":"https://api.github.com/repos/sashadidukh/kaa/deployments","created_at":"2016-04-04T13:30:52Z","updated_at":"2016-04-04T13:31:01Z","pushed_at":"2016-06-27T11:03:01Z","git_url":"git://github.com/sashadidukh/kaa.git","ssh_url":"git@github.com:sashadidukh/kaa.git","clone_url":"https://github.com/sashadidukh/kaa.git","svn_url":"https://github.com/sashadidukh/kaa","homepage":"http://www.kaaproject.org","size":134497,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"kaaproject:develop","ref":"develop","sha":"16726a63fd5a7a2700753e339dd76f6ef34a9566","user":{"login":"kaaproject","id":6984613,"avatar_url":"https://avatars.githubusercontent.com/u/6984613?v=3","gravatar_id":"","url":"https://api.github.com/users/kaaproject","html_url":"https://github.com/kaaproject","followers_url":"https://api.github.com/users/kaaproject/followers","following_url":"https://api.github.com/users/kaaproject/following{/other_user}","gists_url":"https://api.github.com/users/kaaproject/gists{/gist_id}","starred_url":"https://api.github.com/users/kaaproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaaproject/subscriptions","organizations_url":"https://api.github.com/users/kaaproject/orgs","repos_url":"https://api.github.com/users/kaaproject/repos","events_url":"https://api.github.com/users/kaaproject/events{/privacy}","received_events_url":"https://api.github.com/users/kaaproject/received_events","type":"Organization","site_admin":false},"repo":{"id":17839346,"name":"kaa","full_name":"kaaproject/kaa","owner":{"login":"kaaproject","id":6984613,"avatar_url":"https://avatars.githubusercontent.com/u/6984613?v=3","gravatar_id":"","url":"https://api.github.com/users/kaaproject","html_url":"https://github.com/kaaproject","followers_url":"https://api.github.com/users/kaaproject/followers","following_url":"https://api.github.com/users/kaaproject/following{/other_user}","gists_url":"https://api.github.com/users/kaaproject/gists{/gist_id}","starred_url":"https://api.github.com/users/kaaproject/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kaaproject/subscriptions","organizations_url":"https://api.github.com/users/kaaproject/orgs","repos_url":"https://api.github.com/users/kaaproject/repos","events_url":"https://api.github.com/users/kaaproject/events{/privacy}","received_events_url":"https://api.github.com/users/kaaproject/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/kaaproject/kaa","description":"Kaa open-source middleware platform for building, managing, and integrating connected products with the Internet of Everything.","fork":false,"url":"https://api.github.com/repos/kaaproject/kaa","forks_url":"https://api.github.com/repos/kaaproject/kaa/forks","keys_url":"https://api.github.com/repos/kaaproject/kaa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kaaproject/kaa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kaaproject/kaa/teams","hooks_url":"https://api.github.com/repos/kaaproject/kaa/hooks","issue_events_url":"https://api.github.com/repos/kaaproject/kaa/issues/events{/number}","events_url":"https://api.github.com/repos/kaaproject/kaa/events","assignees_url":"https://api.github.com/repos/kaaproject/kaa/assignees{/user}","branches_url":"https://api.github.com/repos/kaaproject/kaa/branches{/branch}","tags_url":"https://api.github.com/repos/kaaproject/kaa/tags","blobs_url":"https://api.github.com/repos/kaaproject/kaa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kaaproject/kaa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kaaproject/kaa/git/refs{/sha}","trees_url":"https://api.github.com/repos/kaaproject/kaa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kaaproject/kaa/statuses/{sha}","languages_url":"https://api.github.com/repos/kaaproject/kaa/languages","stargazers_url":"https://api.github.com/repos/kaaproject/kaa/stargazers","contributors_url":"https://api.github.com/repos/kaaproject/kaa/contributors","subscribers_url":"https://api.github.com/repos/kaaproject/kaa/subscribers","subscription_url":"https://api.github.com/repos/kaaproject/kaa/subscription","commits_url":"https://api.github.com/repos/kaaproject/kaa/commits{/sha}","git_commits_url":"https://api.github.com/repos/kaaproject/kaa/git/commits{/sha}","comments_url":"https://api.github.com/repos/kaaproject/kaa/comments{/number}","issue_comment_url":"https://api.github.com/repos/kaaproject/kaa/issues/comments{/number}","contents_url":"https://api.github.com/repos/kaaproject/kaa/contents/{+path}","compare_url":"https://api.github.com/repos/kaaproject/kaa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kaaproject/kaa/merges","archive_url":"https://api.github.com/repos/kaaproject/kaa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kaaproject/kaa/downloads","issues_url":"https://api.github.com/repos/kaaproject/kaa/issues{/number}","pulls_url":"https://api.github.com/repos/kaaproject/kaa/pulls{/number}","milestones_url":"https://api.github.com/repos/kaaproject/kaa/milestones{/number}","notifications_url":"https://api.github.com/repos/kaaproject/kaa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kaaproject/kaa/labels{/name}","releases_url":"https://api.github.com/repos/kaaproject/kaa/releases{/id}","deployments_url":"https://api.github.com/repos/kaaproject/kaa/deployments","created_at":"2014-03-17T18:48:31Z","updated_at":"2016-06-29T12:40:02Z","pushed_at":"2016-06-29T14:50:22Z","git_url":"git://github.com/kaaproject/kaa.git","ssh_url":"git@github.com:kaaproject/kaa.git","clone_url":"https://github.com/kaaproject/kaa.git","svn_url":"https://github.com/kaaproject/kaa","homepage":"http://www.kaaproject.org","size":145255,"stargazers_count":307,"watchers_count":307,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":120,"mirror_url":null,"open_issues_count":21,"forks":120,"open_issues":21,"watchers":307,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/746"},"html":{"href":"https://github.com/kaaproject/kaa/pull/746"},"issue":{"href":"https://api.github.com/repos/kaaproject/kaa/issues/746"},"comments":{"href":"https://api.github.com/repos/kaaproject/kaa/issues/746/comments"},"review_comments":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/746/comments"},"review_comment":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kaaproject/kaa/pulls/746/commits"},"statuses":{"href":"https://api.github.com/repos/kaaproject/kaa/statuses/011708cdf56bf82e128c6adda55a24838366b3d9"}}}}
{"actor":{"display_login":"Slash32"}}