why? vangav analytics is a vangav backend template covering: service oriented architecture and multi-entry-point api; this is also the analytics service used by all vangav's products

- splitting the analytics backend into writer and reader services is done because writer/reader loads can vary significantly (i.e.: writer can take the load of millions of users using analyzed services while the reader can be used by few system admins); so it's easier to handle these loads by deploying a lot more writer than reader services
- actions are defined in a flexible/generic json file (as explained later in this section) to make it easily extensible in handling analysis as backend services change/grow
- both of the writer and reader services have actions-config-reload feature to allow modifying actions without having to re-start the services

- handles writing analytics
- handles reading actions in various ways (e.g.: by year, by day, by category, ...)
{
"categories": [
{
"category_name": "page_views",
"category_name_short": "PV"
}
],
"action_classes": [
{
"class_name": "backend_page_views",
"class_prefix": "BPV",
"class_wide_categories": [
"PV"
],
"action_ids": [
{
"action_id": "quick_start",
"action_categories": []
}
]
}
]
}
| element |
explanation |
| categories |
defines categories (e.g.: page views, button clicks, ...) |
| category_name |
a category name is used mainly for clarity |
| category_name_short |
is the one used when querying for categories |
| action_classes |
defines classes (e.g.: website, ios app, android app, ...) |
| class_name |
a class name is used mainly for clarity |
| class_prefix |
is the one used when querying for classes |
| class_wide_categories |
categories applied for an action class's action-ids |
| action_ids |
defines a single action (e.g.: home-page, download-button, camera-flip, ...) |
| action_id |
unique action identifier within its class |
| action_categories |
in addition to the class-wide-categories, here one can add extra categories specific to this action |

- this service is based on vangav backend's vangav analytics template
- this service has the 90+% of the vangav backend's generated code + the 10-% of the logic code needed to complete the service
- for first timers - follow the steps in the system requirements tutorial
- for first timers - follow the steps in the workspace initialization tutorial
- download
vos_vangav_analytics_writer.zip and vos_vangav_analytics_reader.zip projects (from the green clone or download button) inside the workspace directory created previously (my_services) and unzip them
- rename unzipped directories, remove the
-master from their names
- in the terminal
cd to vos_vangav_analytics_writer/cassandra/cql/
- execute
./_start_cassandra.sh to start cassandra
cd to vos_vangav_analytics_writer/cassandra/cql/drop_and_create/
- execute the command
./_execute_cql.sh v_analytics_dev.cql to initialize the services' database tables
cd to vos_vangav_analytics_writer and execute ./_run.sh to start the analytics writer service on port 9000
cd to vos_vangav_analytics_reader and execute ./_run.sh 7000 to start the analytics reader service on port 7000
- from your prefered client (we recommned postman) start trying the service; refer to the features and service references sections for reference
- at the end to stop the services: press
control + d in the terminal session where each service was started in (9 and 10)
- to stop cassandra: execute
ps auwx | grep cassandra to get cassandra's (pid) then kill -9 (pid) to stop cassandra
- follow the following steps to import the downloaded backend service in eclipse
cd to the service's directory and execute the ./_eclipsify.sh script
- file > import > general > existing projects into workspace > next > set "select root directory" to my_services > under projects make sure that vos_calculate_sum is selected > finish
- double check the java version used for compiling the project: right click the project > properties > java compiler > enable project specific settings > compiler compliance level > 1.7 or 1.8
- generate multiple services (writer + reader) to work together in a service oriented architecture
- generic service design (handles any type of analytics)
- this section lists the 10-% code added after vangav backend generated 90+% of the code
| file/dir |
change |
| setup data |
added actions.json used to define the analytics structure |
| Global.java |
added actions structure initialization |
| actions |
added the json representation of actions.json as well as its loader |
| controllers |
added the implementation of request processing logic under controller_name/HandlerControllerName.java classes and nested response json structures under controller_name/response_json packages |
| file/dir |
change |
| setup data |
added actions.json used to define the analytics structure |
| Global.java |
added actions structure initialization |
| actions |
added the json representation of actions.json as well as its loader |
| controllers |
added the implementation of request processing logic under controller_name/HandlerControllerName.java classes and nested response json structures under controller_name/response_json packages |
- following are the error codes of whatsapp services
| class |
code : sub_code |
explanation |
| ActionsManager |
|
|
|
400 : 1 |
invalid actions' category |
|
400 : 2 |
actions-config must have at least one actions-class |
|
400 : 3 |
invalid actions class |
|
400 : 4 |
action class wide category doesn't exist |
|
400 : 5 |
an action class must have at least one action id |
|
400 : 6 |
invalid action id |
|
400 : 7 |
invalid action category prefix |
| RequestRecordAction |
|
|
|
501 : 1 |
invalid class prefix and/or action id |
| class |
code : sub_code |
explanation |
| ActionsManager |
|
|
|
400 : 1 |
invalid actions' category |
|
400 : 2 |
actions-config must have at least one actions-class |
|
400 : 3 |
invalid actions class |
|
400 : 4 |
action class wide category doesn't exist |
|
400 : 5 |
an action class must have at least one action id |
|
400 : 6 |
invalid action id |
|
400 : 7 |
invalid action category prefix |
| RequestGetAnnualActionCounters |
|
|
|
501 : 1 |
invalid actions class prefix |
|
501 : 2 |
invalid action id |
|
501 : 3 |
to-year can't be smaller than from-year |
|
501 : 4 |
can't query more than 100 years per request |
| RequestGetDailyActionCounters |
|
|
|
502 : 1 |
invalid actions class prefix |
|
502 : 2 |
invalid action id |
|
502 : 3 |
can't query more than 365 days |
| RequestGetMonthlyActionCounters |
|
|
|
503 : 1 |
invalid actions class prefix |
|
503 : 2 |
invalid action id |
|
503 : 3 |
can't query more than 120 months |
| RequestGetTotalActionCounters |
|
|
|
504 : 1 |
actions class prefix |
|
504 : 2 |
invalid action id |
| RequestGetCategoryActions |
|
|
|
507 : 1 |
category-name-short doesn't exists |

