Partner – Microsoft – NPI EA (cat = Baeldung)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, visit the documentation page.

You can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Microsoft – NPI EA (cat= Spring Boot)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, you can get started over on the documentation page.

And, you can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Orkes – NPI EA (cat=Spring)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag=Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

eBook – Guide Spring Cloud – NPI EA (cat=Spring Cloud)
announcement - icon

Let's get started with a Microservice Architecture with Spring Cloud:

>> Join Pro and download the eBook

eBook – Mockito – NPI EA (tag = Mockito)
announcement - icon

Mocking is an essential part of unit testing, and the Mockito library makes it easy to write clean and intuitive unit tests for your Java code.

Get started with mocking and improve your application tests using our Mockito guide:

Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Reactive – NPI EA (cat=Reactive)
announcement - icon

Spring 5 added support for reactive programming with the Spring WebFlux module, which has been improved upon ever since. Get started with the Reactor project basics and reactive programming in Spring Boot:

>> Join Pro and download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Jackson – NPI EA (cat=Jackson)
announcement - icon

Do JSON right with Jackson

Download the E-book

eBook – HTTP Client – NPI EA (cat=Http Client-Side)
announcement - icon

Get the most out of the Apache HTTP Client

Download the E-book

eBook – Maven – NPI EA (cat = Maven)
announcement - icon

Get Started with Apache Maven:

Download the E-book

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

eBook – RwS – NPI EA (cat=Spring MVC)
announcement - icon

Building a REST API with Spring?

Download the E-book

Course – LS – NPI EA (cat=Jackson)
announcement - icon

Get started with Spring and Spring Boot, through the Learn Spring course:

>> LEARN SPRING
Course – RWSB – NPI EA (cat=REST)
announcement - icon

Explore Spring Boot 3 and Spring 6 in-depth through building a full REST API with the framework:

>> The New “REST With Spring Boot”

Course – LSS – NPI EA (cat=Spring Security)
announcement - icon

Yes, Spring Security can be complex, from the more advanced functionality within the Core to the deep OAuth support in the framework.

I built the security material as two full courses - Core and OAuth, to get practical with these more complex scenarios. We explore when and how to use each feature and code through it on the backing project.

You can explore the course here:

>> Learn Spring Security

Course – LSD – NPI EA (tag=Spring Data JPA)
announcement - icon

Spring Data JPA is a great way to handle the complexity of JPA with the powerful simplicity of Spring Boot.

Get started with Spring Data JPA through the guided reference course:

>> CHECK OUT THE COURSE

Partner – MongoDB – NPI EA (tag=MongoDB)
announcement - icon

Traditional keyword-based search methods rely on exact word matches, often leading to irrelevant results depending on the user's phrasing.

By comparison, using a vector store allows us to represent the data as vector embeddings, based on meaningful relationships. We can then compare the meaning of the user’s query to the stored content, and retrieve more relevant, context-aware results.

Explore how to build an intelligent chatbot using MongoDB Atlas, Langchain4j and Spring Boot:

>> Building an AI Chatbot in Java With Langchain4j and MongoDB Atlas

Partner – LambdaTest – NPI EA (cat=Testing)
announcement - icon

Accessibility testing is a crucial aspect to ensure that your application is usable for everyone and meets accessibility standards that are required in many countries.

By automating these tests, teams can quickly detect issues related to screen reader compatibility, keyboard navigation, color contrast, and other aspects that could pose a barrier to using the software effectively for people with disabilities.

Learn how to automate accessibility testing with Selenium and the LambdaTest cloud-based testing platform that lets developers and testers perform accessibility automation on over 3000+ real environments:

Automated Accessibility Testing With Selenium

1. Overview

Spectator is a library for instrumenting code and collecting data for dimensional time series backend systems. Spectator originated at Netflix for various metrics collection, and the corresponding backend system used with it is mainly Atlas.

In this tutorial, we’ll learn what Spectator provides and how we can use it to collect metrics.

2. Maven Dependencies

Before we dive into the actual implementation, let’s add the Spectator dependency to the pom.xml file:

<dependency>
    <groupId>com.netflix.spectator</groupId>
    <artifactId>spectator-api</artifactId>
    <version>1.7.7</version>
</dependency>

The spectator-api is the core spectator library.

3. Basics of Registry, Meter, and Metrics

Before we start digging more into this library, we should first understand the basics of Registry, Meter, and Metrics.

  • Registry is where we maintain a set of meters
  • Meter is used for collecting a set of measurements about our application, e.g., Counter, Timer, Gauge, etc.
  • Metrics are individual measurements that we display on a Meter, e.g., count, duration, max, average, etc.

Let’s explore these further and understand how they are used in the Spectator library.

4. Registry

The Spectator library comes with Registry as an interface, with some built-in implementations, e.g., DefaultRegistry and NoopRegistry. We can also create custom Registry implementations as per our requirements.

A Registry implementation can be used as below:

Registry registry = new DefaultRegistry();

5. Meter

Meter is of mainly two types, i.e., Active and Passive.

5.1. Active Meters

These meters are used to measure some event’s occurrence. We have three types of such meters:

5.2. Passive Meters

These meters are used to get the value of the metric when needed. For example, the number of running threads could be a metric we want to measure. We have a single type of such meter, Gauge.

Next, let’s explore these different types of meters in detail.

6. Counter

These meters measure the rate at which an event occurs. For example, suppose we want to measure the rate at which elements are inserted or removed from a list.

Let’s first register a counter to the Registry object on initialization:

insertCounter = registry.counter("list.insert.count");
removeCounter = registry.counter("list.remove.count");

Here, we can allow users to use any Registry implementation using dependency injection.

Now, we can increment or decrement the Counter meter for addition to list or deletion from a list, respectively:

requestList.add(element);
insertCounter.increment();

requestList.remove(0);
removeCounter.increment();

In this way, we can generate two meters, and later, we can push the metrics to Atlas for visualization.

7. Timers

These meters measure the time spent on some event. Spectatorsupports two types of timers:

7.1. Timer

These timers are mainly used to measure short-duration events. Therefore, they usually measure the time spent after the completion of the event.

First, we need to register this meter in the Registry:

requestLatency = registry.timer("app.request.latency");

Next, we can invoke the record() method of Timer to measure the time spent in handling the request:

requestLatency.record(() -> handleRequest(input));

7.2. LongTaskTimer

These timers are mainly used to measure the duration of long-running tasks. Therefore, we can query these timers even when the event is in process. This is also a type of Gauge. We can see metrics like duration and activeTasks when the event is in progress.

Again, as a first step, we need to register this meter:

refreshDuration = LongTaskTimer.get(registry, registry.createId("metadata.refreshDuration"));

Next, we can use LongTaskTimer to start and stop measurements around the long-running task:

long taskId = refreshDuration.start();
try {
    Thread.sleep(input);
    return "Done";
} catch (InterruptedException e) {
    e.printStackTrace();
    throw e;
} finally {
    refreshDuration.stop(taskId);
}

8. Gauges

As we discussed earlier, gauges are passive meters. Therefore, these give a value that is sampled at any point in time for a running task. So, for example, we would use it if we wanted to know the number of running threads in a JVM or the heap memory usage at any point in time.

We have two types of gauges:

  • Polled Gauges
  • Active Gauges

8.1. Polled Gauges

This type of gauges polls a running task’s value in the background. It creates a hook on the task it monitors. Hence, there is no need to update the value in this gauge.

Now, let’s see how to use this gauge to monitor a List‘s size:

PolledMeter.using(registry)
  .withName("list.size")
  .monitorValue(listSize);

Here, PolledMeter is the class that allows background polling on listSize using the monitorValue() method. Further, listSize is the variable that tracks the size of our sample list.

8.2. Active Gauges

This type of gauge requires regular manual updates on the value with respect to updates in monitoring tasks. Here is an example of using active gauges:

gauge = registry.gauge("list.size");

We first register this gauge in the Registry. Then, we manually update it on the addition or removal of elements from the list:

list.add(element);
gauge.set(listSize);
list.remove(0);
gauge.set(listSize);

9. DistributionSummary

Now, we will look into another meter known as DistributionSummary. It tracks the distribution of events. This meter can measure the size of the request payload. For example, we’ll use DistributionSummary to measure a request’s size.

First, as always, we register this meter in Registry:

distributionSummary = registry.distributionSummary("app.request.size");

Now, we can use this meter similar to a Timer to record the request’s size:

distributionSummary.record((long) input.length());
handleRequest();

10. Spectator vs. Servo vs. Micrometer

Servo is also a library to measure different code metrics. Spectator is a successor to Servo, built by Netflix. Spectator was initially launched for Java 8, and from a future support perspective, it is a better option.

These Netflix libraries are one of the various options available in the market to measure different metrics. We can always use them individually, or we can go for a facade like Micrometer. Micrometer lets users switch between different metrics measuring libraries with ease. Hence, it also allows a choice of different backend monitoring systems.

11. Conclusion

In this article, we have introduced Spectator, a library from Netflix for metrics measurement. Also, we looked into the usage of its various active and passive meters. We can push and publish the instrumented data to the time-series database Atlas.

The code backing this article is available on GitHub. Once you're logged in as a Baeldung Pro Member, start learning and coding on the project.
Baeldung Pro – NPI EA (cat = Baeldung)
announcement - icon

Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:

>> Explore a clean Baeldung

Once the early-adopter seats are all used, the price will go up and stay at $33/year.

Partner – Microsoft – NPI EA (cat = Baeldung)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, visit the documentation page.

You can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Microsoft – NPI EA (cat = Spring Boot)
announcement - icon

Azure Container Apps is a fully managed serverless container service that enables you to build and deploy modern, cloud-native Java applications and microservices at scale. It offers a simplified developer experience while providing the flexibility and portability of containers.

Of course, Azure Container Apps has really solid support for our ecosystem, from a number of build options, managed Java components, native metrics, dynamic logger, and quite a bit more.

To learn more about Java features on Azure Container Apps, visit the documentation page.

You can also ask questions and leave feedback on the Azure Container Apps GitHub page.

Partner – Orkes – NPI EA (cat = Spring)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

Partner – Orkes – NPI EA (tag = Microservices)
announcement - icon

Modern software architecture is often broken. Slow delivery leads to missed opportunities, innovation is stalled due to architectural complexities, and engineering resources are exceedingly expensive.

Orkes is the leading workflow orchestration platform built to enable teams to transform the way they develop, connect, and deploy applications, microservices, AI agents, and more.

With Orkes Conductor managed through Orkes Cloud, developers can focus on building mission critical applications without worrying about infrastructure maintenance to meet goals and, simply put, taking new products live faster and reducing total cost of ownership.

Try a 14-Day Free Trial of Orkes Conductor today.

eBook – HTTP Client – NPI EA (cat=HTTP Client-Side)
announcement - icon

The Apache HTTP Client is a very robust library, suitable for both simple and advanced use cases when testing HTTP endpoints. Check out our guide covering basic request and response handling, as well as security, cookies, timeouts, and more:

>> Download the eBook

eBook – Java Concurrency – NPI EA (cat=Java Concurrency)
announcement - icon

Handling concurrency in an application can be a tricky process with many potential pitfalls. A solid grasp of the fundamentals will go a long way to help minimize these issues.

Get started with understanding multi-threaded applications with our Java Concurrency guide:

>> Download the eBook

eBook – Java Streams – NPI EA (cat=Java Streams)
announcement - icon

Since its introduction in Java 8, the Stream API has become a staple of Java development. The basic operations like iterating, filtering, mapping sequences of elements are deceptively simple to use.

But these can also be overused and fall into some common pitfalls.

To get a better understanding on how Streams work and how to combine them with other language features, check out our guide to Java Streams:

>> Join Pro and download the eBook

eBook – Persistence – NPI EA (cat=Persistence)
announcement - icon

Working on getting your persistence layer right with Spring?

Explore the eBook

Partner – MongoDB – NPI EA (tag=MongoDB)
announcement - icon

Traditional keyword-based search methods rely on exact word matches, often leading to irrelevant results depending on the user's phrasing.

By comparison, using a vector store allows us to represent the data as vector embeddings, based on meaningful relationships. We can then compare the meaning of the user’s query to the stored content, and retrieve more relevant, context-aware results.

Explore how to build an intelligent chatbot using MongoDB Atlas, Langchain4j and Spring Boot:

>> Building an AI Chatbot in Java With Langchain4j and MongoDB Atlas

Course – LS – NPI EA (cat=REST)

announcement - icon

Get started with Spring Boot and with core Spring, through the Learn Spring course:

>> CHECK OUT THE COURSE

eBook Jackson – NPI EA – 3 (cat = Jackson)