One of the most widely used tools for monitoring resources is Prometheus. Let’s see how to set it up on AWS EC2 and how the Prometheus architecture would look like.

Introduction

Prometheus software is a monitoring solution that is responsible for collecting the metrics data and gives us the ability to visualize the collected data. Still, we will be using Grafana today, as it is more focused on the data visualization part.

Prometheus works in such a way that it scrapes the specific target whose HTTP endpoint is exposed; the scraped metrics from the target are then stored in a time series database that can be queried using PromQl (Prometheus query language). When you install prometheus it allows you to generate alerts when the metrics reach the specified threshold. Imagine Prometheus in such a way that your older sister tells you to have a look at what your mom is making and give her updates every 10 minutes. The act of you checking the kitchen is similar to how Prometheus is scraping metrics from the specified targets at regular intervals. Just as reporting her back to your sister is similar to how Prometheus stores the collected data and makes it available for you, if anything goes wrong (like the soup boiling over), you alter your sister immediately; similarly, Prometheus can trigger alerts.

The metrics scraped by Prometheus can be visualised using Grafana. Grafana provides us with lots of amazing dashboards for data visualization. Data can be visualized in the form of charts and graphs, and we can also use Grafana to aggregate logs using Grafana Loki 

So, let’s see how we can use, install, and configure Prometheus to monitor our AWS EC2.

Setting up AWS EC2

To answer the question of “how to set up EC2 instance in AWS”, we will be using a single EC2 instance to set up Prometheus, Node Exporter, and Grafana. Let’s start by launching our EC2 server.

Steps by Step Guide:

     

      1. Open the Amazon EC2 console.

      1. Launch an instance.

      1. Choose Ubuntu as the AMI (Amazon Machine Image).

      1. Choose an Instance Type for this blog; we will be using t2.micro

      1. Generate a key pair.

      1. Leave the rest as default; we will be configuring it later.

      1. Next, launch instance.

    If you have any trouble setting the EC2 instance, you can always refer to the gif below.

    Configuring Security Rules

    For running the Prometheus server, node-exporter, and Grafana server, we need to edit inbound rules so that we can access them (as we are using a single instance). To successfully install and configure Prometheus, here are the inbound rules, Follow the steps:-

       

        1. Navigate to the security sections and go to security groups.

        1. Next, click on Edit inbound rules and then Add rule. We will add rules for Prometheus, node-exporter, and Grafana.

        1. Now select the Type to Custom TCP, Port range 9090 for Prometheus, 9100 for Node Exporter, and 3000 for Grafana, CIDR block to 0.0.0.0/0, and add the description.

      Then Save the rules, they must look something like this :

         

          1. Now that we have our inbound rules set up, we can now start creating our Prometheus server setup.

        Go to your instance and update the package using sudo apt-get update

        Installing Prometheus Server in EC2

        To answer “How to install Prometheus”, let’s start by creating a new user other than the root user. And making the Prometheus directory under /etc/ and /var/lib/ directory.

        #This command is to create user prometheus without the home directory
        sudo useradd --no-create-home prometheus
        #Making prometheus directory under etc
        sudo mkdir /etc/prometheus
        #Making prometheus directory under lib
        sudo mkdir /var/lib/prometheus

        We are using –no-create-home user because we are going to use the prometheus user for a specific purpose, i.e., for using it as a service. We do not want it to interact with the user for any kind of login or personal use. So it is better to use this than using the root user for everything.

        Once our directory is set up, we need to install Prometheus. To download Prometheus, go to DOWNLOAD and copy the link.

        Or just use the following command to install Prometheus 2.48.0; it will download the tar file.

        # To download Prometheus 2.48.0
        wget
        https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz

        To unzip the tar file tar xvfz prometheus-2.48.0.linux-amd64.tar.gz use the following command, and it will generate the untared file.

        To check the untared, use the ls command.

        You were using the bare matel; you can just go into the prometheus-2.48.0.linux-amd64 directory and run ./prometheus to start your server. You can also install it in your EC2 instance, but we will install it in our system so that we can use systemctl commands.

        The following commands will be used to install the Prometheus toolkit in our system (command is explained using a comment):-

        #Copy the Prometheus binary to /usr/local/bin
        sudo cp prometheus-2.48.0.linux-amd64/prometheus /usr/local/bin

        #Copy promtool to /usr/local/bin/
        sudo cp prometheus-2.48.0.linux-amd64/promtool /usr/local/bin/

        # Copy the consoles directory to /etc/prometheus
        sudo cp -r prometheus-2.48.0.linux-amd64/consoles /etc/prometheus

        #Copy the 'console_libraries' directory to /etc/prometheus
        sudo cp -r prometheus-2.48.0.linux-amd64/console_libraries /etc/prometheus

        sudo cp prometheus-2.48.0.linux-amd64/promtool /usr/local/bin/

        #Remove the Prometheus archive and extracted directory
        rm -rf prometheus-2.48.0.linux-amd64.tar.gz prometheus-2.48.0.linux-amd64

        Now we need to add a prometheus.yml file that will have the configuration file for the prometheus.

        sudo vi /etc/prometheus/prometheus.yml

        Let’s add the configurations once we are in our newly created prometheus.yml.

        global:
          scrape_interval: 15s
          external_labels:
            monitor: 'prometheus'
        scrape_configs:
          - job_name: 'prometheus'
            static_configs:      - targets: ['localhost:9090']

        Let’s see what this configuration is :

           

            • Global Configuration(global)

            • scrape_interval: This sets the interval at which Prometheus scrapes targets for metrics. In this case, it is set to 15 seconds (15s).

            • external_labels: These are labels that are applied to all scraped metrics. In this case, there is one label named monitor with the value ‘prometheus’.

            • Scrape Configurations (scrape_configs):

            • – job_name: ‘prometheus’: This is the name of the job. In this case, it is named ‘prometheus’.

            • static_configs: Defines a list of targets to scrape metrics from.

            • – targets: [‘localhost:9090‘]: This specifies that Prometheus should scrape metrics from the target, where presumably the Prometheus server itself is running.

          Now that our configuration of Prometheus is done, we will have to add a service file that will define how our Prometheus service will be managed by systemd.

          [Unit]
          Description=Prometheus
          Wants=network-online.target
          After=network-online.target

          [Service]

          User=prometheus
          Group=prometheus
          Type=simple
          ExecStart=/usr/local/bin/prometheus \
              --config.file /etc/prometheus/prometheus.yml \
              --storage.tsdb.path /var/lib/prometheus/ \
              --web.console.templates=/etc/prometheus/consoles \
              --web.console.libraries=/etc/prometheus/console_libraries

          [Install]
          WantedBy=multi-user.target

          Let’s understand what we are doing here:

             

              1. Unit Section ([Unit]):

                   

                    • Description: is a human-readable description of the service, indicating that this unit is for Prometheus.

                    • Wants: Indicates a dependency on network-online.target, meaning that this service should not start until network services are available.

                1. Service Section ([Service]):

                     

                      • User=prometheus: Specifies the user under which the Prometheus service should run. This is likely the user you created earlier for Prometheus.

                      • Group=prometheus: Specifies the group under which the Prometheus service should run.

                      • Type=simple: Indicates that the service type is a simple process that does not fork.

                      • ExecStart: Specifies the command to start the Prometheus service. It includes the path to the prometheus binary and various command-line options:

                           

                            • –config.file: Specifies the path to the Prometheus configuration file.

                            • –storage.tsdb.path: Specifies the path to the directory where Prometheus should store its time-series database.

                            • –web.console.templates and –web.console.libraries: Specify the paths for the web console templates and libraries.

                    1. Install Section ([Install]):

                         

                    Finally, we will change the file permission we just created:-

                    sudo chown prometheus:prometheus /etc/prometheus
                    sudo chown prometheus:prometheus /usr/local/bin/prometheus
                    sudo chown prometheus:prometheus /usr/local/bin/promtool
                    sudo chown -R prometheus:prometheus /etc/prometheus/consoles
                    sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
                    sudo chown -R prometheus:prometheus /var/lib/prometheus

                    Next, is to reload system configuration, so that it could take the new configuration that we added. Then we will enable the Prometheus service to start at the boot. Lastly, we will start the service.

                    To check the status of the service is running or not, use sudo systemctl status prometheus.

                    Hooray! Prometheus service is successfully configured. Let’s check how it looks:

                    Just go to the new tab and enter <your-public-ip>:9090.

                    Yay!! We successfully configured the Prometheus service.

                    Conclusion

                    And, there you have it! We were able to successfully set up Prometheus on the EC2 instance. Just remember, this is the beginning. The world of cloud monitoring is vast and constantly evolving. There are always new metrics to track, new issues to troubleshoot, and new ways to optimise your cloud resources. We would suggest you check out our other blogs too, on the CloudZenia website, like Step-by-Step Tutorial: Monitoring AWS Resources with Prometheus and Grafana.

                    Loads of gratitude for reading our blog. Keep exploring and learning!

                    Dec 11, 2023