From b012b90c70089a4ba5915d5a6eeb11ea4307eac9 Mon Sep 17 00:00:00 2001 From: Erick Date: Sun, 1 Jun 2025 21:12:00 -0300 Subject: [PATCH 1/2] Feature: enhanced README documentation for better understanding of the project --- README.md | 83 +++++++++++++++++++++++++++++++++++++++--- docs/architecture.PNG | Bin 0 -> 66632 bytes 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 docs/architecture.PNG diff --git a/README.md b/README.md index 05cb850..b6a3379 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,93 @@ # Log Aggregator -A micro-services based approach to collect logs from different soruces, process them and store them in a cloud-based solution to allow analysis. +A micro-services based approach to collect logs from different soruces, process them and store them in a cloud-based solution to allow analysis. This app collects logs from different sources, parses them and then sends it to a Elasticsearch-Kibana stack for indexing and analysis + +LogAggregator can be seen as a (very) specific subset of [Logstash](https://www.elastic.co/logstash), a data pipeline that collects, process and sends the log to a specific "stash", which is usually the log collector when using the ELK stash (Elasticsearch-Logstash-Kibana) for log analysis. In this sense, the design of LogAggregator allows any service with a local log solution to forward its logging data to LogAggregator and then + +It is built upon a Flask application with JWT authentication for log posting. Services that will be monitored by this solution need to register and get a valid user, which can be done by requesting to the admin of the service. Only the admin has access to create new users. ## Stack used -Python +Python 3.13.2 + Flask + GUnicorn (WSGI server) +Elasticserach v8.17 for indexing + +Kibana v8.17 for log analysis. + +Amazon S3 for log storage + +## Architecture + +The following diagram describes the current architecture of the solution, broken down in the key components used within the LogAggregator solution: + +![](.\docs\architecture.PNG) + +Mainly, the objective of LogAggregator is to consolidate, parse and send the logs for storage in S3 and for indexing in Elasticsearch. Lastly, Kibana is directly plugged into Elasticsearch which allows us to use all the tooling that Kibana provides for index patterns, analysis, alerts, etc, all based on the data that the LogAggregator pushes. + + ## Author [Erick Grilo](https://simasgrilo.github.io) ## Features: -- [ ] Log collection from services that needs to log just need to send the service to the logging service (given that the service is authorized) in a standardized manner -- [ ] Serverless (deployed in cloud, both the service and the logs) -- [ ] Visualization of the logs using Kibana +- [X] Log collection from services that needs to log just need to send the service to the logging service (given that the service is authorized) in a standardized manner +- Authentication and Authorization using JWT for logging measures +- [X] User creation and administration by admin +- [ ] Serverless (deployed in cloud, both the service and the logs). Not yet in productive cloud but one can set in a EKS following the sequence of .yaml files +- [X] Visualization of the logs using Kibana, including alert setup +- [X] Kubernetes-ready solution + +## Getting Started + +The following steps will allow you to setup a local Kubernetes cluster. It assumes that you have already a k8s distribution installed like minikube or k3s. It also assumes that you have your AWS credentials set up (preferably a IAM user with access key and access secret key setup) + +- Start by installing Elastic's CRDs for Kibana and Elasticsearch + +``` +kubectl apply -f https://download.elastic.co/downloads/eck/2.2.0/operator.yaml +kubectl apply -f "C:\Next level\PSP - Yuri\100 Days\LogAggregator\kube\elasticsearch.yaml" +kubectl apply -f "C:\Next level\PSP - Yuri\100 Days\LogAggregator\kube\kibana.yaml" +``` + +- Retrieve the Elastic secret for the elastic user to be used in the Elasticsearch connection +``` +kubectl get secret es-es-elastic-user -o go-template='{{.data.elastic | base64decode}}' +``` + +- Setup the LogAggregator with the following commands. Remember to update file kube/log-aggregator-volume.yaml with your elastic credentials. Note that htis step will require simasgrilo/log-aggregator:latest pushed to Docker Hub (which currently is, but you can also build your own container from this project's Dockerfile.) +``` +kubectl create secret generic aws-credentials --from-literal=aws_access_key_id=YOUR_AWS_ACCESS_KEY_ID --from-literal=aws_secret_access_key=YOUR_AWS_SECRET_ACCESS_KEY +kubectl apply -f "kube/log-aggregator-volume.yaml" +kubectl apply -f "kube/log-aggregator.yaml" +``` + +And it's good to go! to add a service to the cluster to be monitored by LogAggregator, you can refer to a sample service in [DNSResolvr](https://github.com/simasgrilo/DNSResolvr) + +``` +kubectl apply -f "dns-resolver-configmap.yaml" +kubectl apply -f "dns-resolver.yaml" +``` + +Note that to communicate with the LogAggregator, one can use a similar configmap as ```dns-resolver-configmap.yaml``` and refer to the corresponding service name and port exposed by the Kubernetes service in file ```kube/log-aggregator-volume.yaml```, namely in this section: + +``` + { + "LogAggregator": { + "protocol": "http", + "host": "log-aggregator-service", + "port": 3001, + "endpoint": "/log", + "username" : , + "password" : , + "login": "/auth/login" + }, +``` +Upon startup, a user "admin" is generated with a random password. be sure to store this as this will be used to create system users for the other services being logged. +# Demo +Under construction diff --git a/docs/architecture.PNG b/docs/architecture.PNG new file mode 100644 index 0000000000000000000000000000000000000000..20b544967debaf938fb17ce77fe502635f4d40fe GIT binary patch literal 66632 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 BC$9hi literal 0 HcmV?d00001 From 324c8f95c585da769251bade7818a8e2792bb559 Mon Sep 17 00:00:00 2001 From: Erick Simas Grilo Date: Sun, 1 Jun 2025 21:50:54 -0300 Subject: [PATCH 2/2] Update README.md with correct image path for Unix --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b6a3379..d8b6572 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ A micro-services based approach to collect logs from different soruces, process them and store them in a cloud-based solution to allow analysis. This app collects logs from different sources, parses them and then sends it to a Elasticsearch-Kibana stack for indexing and analysis -LogAggregator can be seen as a (very) specific subset of [Logstash](https://www.elastic.co/logstash), a data pipeline that collects, process and sends the log to a specific "stash", which is usually the log collector when using the ELK stash (Elasticsearch-Logstash-Kibana) for log analysis. In this sense, the design of LogAggregator allows any service with a local log solution to forward its logging data to LogAggregator and then +LogAggregator can be seen as a (very) specific subset of [Logstash](https://www.elastic.co/logstash), a data pipeline that collects, process and sends the log to a specific "stash", which is usually the log collector when using the ELK stash (Elasticsearch-Logstash-Kibana) for log analysis. In this sense, the design of LogAggregator allows any service with a local log solution to forward its logging data to LogAggregator and then enabling analysis in a central service. It is built upon a Flask application with JWT authentication for log posting. Services that will be monitored by this solution need to register and get a valid user, which can be done by requesting to the admin of the service. Only the admin has access to create new users. @@ -24,7 +24,7 @@ Amazon S3 for log storage The following diagram describes the current architecture of the solution, broken down in the key components used within the LogAggregator solution: -![](.\docs\architecture.PNG) +![](docs/architecture.PNG) Mainly, the objective of LogAggregator is to consolidate, parse and send the logs for storage in S3 and for indexing in Elasticsearch. Lastly, Kibana is directly plugged into Elasticsearch which allows us to use all the tooling that Kibana provides for index patterns, analysis, alerts, etc, all based on the data that the LogAggregator pushes. @@ -36,7 +36,7 @@ Mainly, the objective of LogAggregator is to consolidate, parse and send the log - [X] Log collection from services that needs to log just need to send the service to the logging service (given that the service is authorized) in a standardized manner - Authentication and Authorization using JWT for logging measures - [X] User creation and administration by admin -- [ ] Serverless (deployed in cloud, both the service and the logs). Not yet in productive cloud but one can set in a EKS following the sequence of .yaml files +- [X] Serverless (deployed in cloud, both the service and the logs) - [X] Visualization of the logs using Kibana, including alert setup - [X] Kubernetes-ready solution