Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Objective

This is a demo project to build a dashboard for business to analyse usage of their website using an event driven architecture. Under the hood, it uses AWS OpenSearch service, S3 and Lambda. Project utilizes terraform and Makefile easy maintenance and deployment.

Check the Contino blog for more details.

How it works

Whenever a new file arrives at the s3 bucket, a lambda function is triggered which index the new logs into the target OpenSearch cluster. This way the dashboard is updated in near real time.

Following is a sample screenshot of the dashboard.

Dashboard


We are assuming the web servers fleet has a mechanism to regularly push logs to an S3 log bucket. This article does not cover that part. However there are sample AWS CLI commands to mimic this behavior.


Design

Architecture

Dataset

For testing, we are using a public dataset which has about 3million Apache web access logs entries. Samples from this dataset are stored under ./sample_data directory.

Notes:

This is for demo only. For production use-cases, more strict security settings are required.

  • To keep it simple, no VPC is used.
  • Kibana Dashboard and ElasticSearch endpoint will be accessible from a single IP address only. This is the public IP from which the project is deployed.
  • At the time of this work, the latest Terraform AWS provider version was 4.8. The AWS change from ElasticSearch to OpenSearch is not updated on it. Hence the code is using ElasticSearch 7.10 which is the last version of ElasticSearch AWS supports. This change is in the pipeline for terraform. Ref: Terraform ticket
  • Project is relying on the UNIX make command to facilitate CI/CD. Run the "make help" command for more details.
  • Dashboard is generated from an existing file: kibana_dashboard_export.ndjson

Development Setup

If not already there, install Python3, Terraform, pipenv and AWS CLI. You would need to configure AWS CLI credentials prior to running the "make deploy" command.

# Install pipenv
pip install pipenv
# Install & Configure AWS CLI
pip install awscli
aws configure

Checkout project

git clone https://github.com/contino/web-usage-dashboard.git
cd web-usage-dashboard

Configure Python virtual environment and download dependencies:

make init

Test

You can run Python unit tests for Lambda code as follows.

make test

Build

This will package the lambda code along with its dependencies into a deployable zip file.

make build

Deploy

This will deploy the terraform code into AWS cloud.

make deploy PROJECT_NAME=<project name>

Under the hood, it constructs and executes the "terraform apply" command. On successful completion, this will create the required cloud resources and generate an output as follows.

Kibana Dashboard: "https://<domain name>.eu-west-2.es.amazonaws.com/_plugin/kibana/app/dashboards"
Upload a sample log file to test by using the following command:
aws s3 cp ./sample_data/2021-12.log s3://manitest6-20220414145147066300000001/

Demo

The application can be tested by manually adding log files into S3. There is no data in the cluster immediately after it is created. To demo, follow the steps below.```

# Step-1: Deploy the infrastructure. This may take a few mins.
make deploy PROJECT_NAME=<project name>
# Step-2: Open Kibana URL in your preferred browser. # Dashboard is empty at this stage as there is no data indexed yet.
# Step-3: Add logs to bucket
aws s3 cp ./sample_data/2021-12.log s3://<bucket name>/ # Step-4: Go back to the dashboard and refresh. It should have data for the period 2021-12 now.

How to destroy

make destroy PROJECT_NAME=<project name>