} Redis provides data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes, and streams. logger.info("home() has been called"); } Task Execution and Scheduling Metrics, 7.7. * Spring properties. How do I read / convert an InputStream into a String in Java? import io.micrometer.core.instrument.util.HierarchicalNameMapper The following example filters out any meters that have an ID starting with example.remote. }. A request predicate is automatically generated for each operation on a web-exposed endpoint. The following example exposes a read operation that returns a custom object: You can also write technology-specific endpoints by using @JmxEndpoint or @WebEndpoint. To do so, either inject the AuditEventRepository bean into your own components and use that directly or publish an AuditApplicationEvent with the Spring ApplicationEventPublisher (by implementing ApplicationEventPublisherAware). pom.xml contains below dependencies. }, @Configuration(proxyBeanMethods = false) - the incident has nothing to do with me; can I use this this way? public MyBean(MeterRegistry registry) { For caches not defined in the caches configuration, such as caches created on the fly or programmatically after the startup phase, an explicit registration is required. } @Bean import org.springframework.context.annotation.Bean; public class MyMeterBinderConfiguration { public class MyReactiveHealthIndicator implements ReactiveHealthIndicator { // perform some specific health check They are intended to be used to expose an existing servlet as an endpoint. child.crossContext = true import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) For more details on the concepts behind percentiles-histogram, percentiles, and slo, see the Histograms and percentiles section of the Micrometer documentation. By default, the endpoint exposes git.branch, git.commit.id, and git.commit.time properties, if present. } val initializer = getServletContextInitializer(contextPath) WebTo leverage JCache in your Spring Boot application, you will need to do the following: Add org.springframework.boot:spring-boot-starter-cache dependency Add @EnableCaching annotation to your main class Add @CacheResult (cacheName = "books") annotation to every method you want to cache Add spring.cache.type=jcache to your To provide custom health information from a reactive API, you can register Spring beans that implement the ReactiveHealthIndicator interface. 3. If your IDE has the Spring Initializr integration, you can complete this process from your IDE. }, import io.micrometer.core.instrument.binder.mongodb.MongoCommandTagsProvider In order to benefit from Inverse of Control, You can enable them in any environment by using the management.endpoint.health.probes.enabled configuration property. To enable statistics, the standard JPA property hibernate.generate_statistics must be set to true. http.securityMatcher(EndpointRequest.toAnyEndpoint()).authorizeHttpRequests { requests -> Spring Boot If a @ReadOperation returns a value, the response status will be 200 (OK). You can turn it on by setting the spring.jmx.enabled configuration property to true. } use Azure Redis Cache in Spring | Microsoft Learn public MeterRegistryCustomizer metricsCommonTags() { Java Development Kit (JDK) version 8 or higher. import org.springframework.context.annotation.Bean Metrics are published under the spring.integration. How to serialize Object when using spring data redis reactive with azure cosmos db. Per-meter customizations are applied, using Spring Boots PropertiesMeterFilter, to any meter IDs that start with the given name. }. The following example disables Datadog: You can also disable all registries unless stated otherwise by the registry-specific property, as the following example shows: Spring Boot also adds any auto-configured registries to the global static composite registry on the Metrics class, unless you explicitly tell it not to: You can register any number of MeterRegistryCustomizer beans to further configure the registry, such as applying common tags, before any meters are registered with the registry: You can apply customizations to particular registry implementations by being more specific about the generic type: Spring Boot also configures built-in instrumentation that you can control through configuration or dedicated annotation markers. Add another bean BookCacheInitialzer Autowire the current bean BookService in BookCacheInitialzer in PostConstruct method of BookCacheInitialzer fun graphiteMetricsNamingConvention(): MeterRegistryCustomizer { Spring Boot will log a warning message for any health indicator that takes longer than 10 seconds to respond. WebSpring. For example, if you want to get started using Spring and JPA for database access, include the spring-boot-starter-data-jpa dependency in your project. You can use @ControllerEndpoint and @RestControllerEndpoint to implement an endpoint that is exposed only by Spring MVC or Spring WebFlux. If the device-id (required for v1 but not used in v2) is set in the v1 namespace, metrics are exported to the v1 endpoint. To learn more, see our tips on writing great answers. requests.anyRequest().hasRole("ENDPOINT_ADMIN") Actuator is supported natively with Spring MVC, Spring WebFlux, and Jersey. If the readiness state of an application instance is unready, Kubernetes does not route traffic to that instance. }, import io.micrometer.core.instrument.Gauge import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; This tutorial is a starting point for Boot, in other words, a way to get started in a simple manner with a basic web application. An Azure subscription - create one for free. Spring Boots actuator module includes additional support that is activated when you deploy to a compatible Cloud Foundry instance. import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) The recommended way to enable the features is to add a dependency on the spring-boot-starter-actuator Starter. Spring Boot import io.micrometer.core.instrument.config.NamingConvention; Auto-configuration enables system metrics by using core Micrometer classes. host.addChild(child); mongodb.driver.pool.waitqueuesize reports the current size of the wait queue for a connection from the pool. For reactive applications, such as those that use Spring WebFlux, ReactiveHealthContributor provides a non-blocking contract for getting application health. import org.springframework.boot.actuate.info.InfoContributor Shows any Liquibase database migrations that have been applied. This feature can be very useful for reporting and for implementing a lock-out policy based on authentication failures. import org.springframework.web.bind.annotation.RequestMapping; E.g solutions like NCache / TayzGrid provides Cache startup loader feature, that allows you to load cache at startup with objects using a configurable cache startup loader. Refresh the page, check Medium Each can be enabled by setting its management.info..enabled property to true. An endpoint is considered to be available when it is both enabled and exposed. Similarly, to create a group that excludes the database indicators from the group and includes all the other indicators, you can define the following: By default, groups inherit the same StatusAggregator and HttpCodeStatusMapper settings as the system health. The latter is typically used to perform authorization checks by using its isUserInRole(String) method. init { } You can set the management.server.port property to change the HTTP port, as the following example shows: When configured to use a custom port, you can also configure the management server with its own SSL by using the various management.server.ssl. If an operation is invoked without a required parameter or with a parameter that cannot be converted to the required type, the operation method is not called, and the response status will be 400 (Bad Request). If you have secured your application and wish to use, Health indicators are usually called over HTTP and need to respond before any connection timeouts. public GraphiteMeterRegistry graphiteMeterRegistry(GraphiteConfig config, Clock clock) { Today, I will explain to you, what and how through the following topics: Caching is the process of storing data that was once fetched so that in the future, a second request can be served without needing to fetch the resource again. You need to provide an implementation of the health() method and return a Health response. private Mono doHealthCheck() { To take full control over endpoint registration in the JMX domain, consider registering your own EndpointObjectNameFactory implementation. One possible way you can load all objects in cache is if caching solution being used provides you a way to load all objects at startup. Database Caching with Spring Boot and Hazelcast Consider the following JSON request body: You can use this to invoke a write operation that takes String name and int counter parameters, as the following example shows: The parameters passed to endpoint operation methods are, if necessary, automatically converted to the required type. Hence, we just need to retrieve the list of all available books and then, using CacheManager, we populate the book cache. WebThere are a lot of developers praising the hottest, and fastest, Java REST frameworks: Micronaut, Quarkus, Spring Boot, and Helidon. import org.springframework.security.web.SecurityFilterChain, @Configuration(proxyBeanMethods = false) return MeterRegistryCustomizer { registry -> Auto-configured ReactiveHealthIndicators, 2.9.1. dictionary = Dictionary.load() Give greater weight to recent samples by accumulating them in ring buffers which rotate after a configurable expiry, with a import org.springframework.context.annotation.Bean import java.io.IOException Add the following application properties: By default, Spring Boot samples only 10% of requests to prevent overwhelming the trace backend. I want to use azure redis cache for caching while using spring boot with cosmos DB. the number of hits count is high. InMemoryAuditEventRepository has limited capabilities, and we recommend using it only for development environments. Spring Boot To customize the items that are included in each recorded exchange, use the management.httpexchanges.recording.include configuration property. }, import org.springframework.boot.actuate.health.Health You can also enable or disable selected indicators by configuring management.health.key.enabled, A servlet can be exposed as an endpoint by implementing a class annotated with @ServletEndpoint that also implements Supplier. They are also exposed as separate HTTP Probes by using health groups: "/actuator/health/liveness" and "/actuator/health/readiness". Putting them in the cache with the findAll() method means that you must annotate findAll() with @Cacheable. class MyJmxConfiguration { (atleast 1000 hits per sec). }, import org.springframework.boot.actuate.info.Info To export metrics to SaaS Humio, you must provide your API token: You should also configure one or more tags to identify the data source to which metrics are pushed: By default, metrics are exported to an Influx v1 instance running on your local machine with the default configuration. Auto-configuration registers a MicrometerConsumerListener and MicrometerProducerListener for the auto-configured consumer factory and producer factory, respectively. @Override import io.micrometer.core.instrument.Tags // perform some specific health check Most registries share common features. context.addServlet("cloudfoundry", servlet).addMapping("/*"); For all other operations, the consumes clause is empty. The application is receiving traffic. registry.config().namingConvention(this::name) Disabled by default. The in-memory backend disables itself as soon as you use any other available backend. Such a parameter is added to the path predicate as a path variable. public class MyCommandTagsProviderConfiguration { } If it does not return a value, the response status will be 204 (No Content). }. Checking External State With Kubernetes Probes, 2.9.2. import org.springframework.context.annotation.Bean; A DefaultMeterObservationHandler is automatically registered on the ObservationRegistry, which creates metrics for every completed observation. would you be kind to improve your example, because as such, I don't get the point behind calling. The starters contain a lot of the dependencies that you need to get a project up and running quickly and with a consistent, supported set of managed transitive dependencies. If tags with the same key are specified with Micrometer, they overwrite the default dimensions. import org.apache.catalina.core.StandardContext child.addLifecycleListener(FixContextListener()) import io.micrometer.core.instrument.Clock; Requires the SpringApplication to be configured with a BufferingApplicationStartup. import io.micrometer.core.instrument.util.HierarchicalNameMapper } import io.micrometer.graphite.GraphiteMeterRegistry; For example, health is exposed as /actuator/health. }. If you don't have one, create a Maven project with the Spring Initializr. The following properties allow per-meter customization: Whether to accept meters with certain IDs. private String toHierarchicalName(Meter.Id id, NamingConvention convention) { Also, Hikari-specific metrics are exposed with a hikaricp prefix. observation.lowCardinalityKeyValue("some-tag", "some-value"); The following system metrics are provided: Uptime metrics (both the amount of time the application has been running and a fixed gauge of the absolute start time). By default, metrics are exported to the metrics JMX domain. On a HotSpot JVM, an HPROF-format file is returned. import org.springframework.context.annotation.Configuration, @Configuration(proxyBeanMethods = false) import jakarta.servlet.ServletContainerInitializer; After Zipkin is running, you can start your application. java - How to cache data during application startup in class MySecurityConfiguration { We have learned that ApplicationContext s are cached and re-used, so we need to consider the isolation. import io.micrometer.observation.ObservationRegistry; child.addLifecycleListener(new Tomcat.FixContextListener()); Alternatively, to disable every contributor that is usually enabled by default, set the management.info.defaults.enabled property to false. After defining our repository implementation, the only thing missing is using it. You can provide the location of the Atlas server: A Datadog registry periodically pushes metrics to datadoghq. import io.micrometer.jmx.JmxConfig; You can use an HTTP range request to request part of an HTTP resource. When the env contributor is enabled, you can customize the data exposed by the info endpoint by setting info. For more detail, see the Micrometer Native Metrics section of the Spring Kafka documentation. For more details please see the Micrometer Observation documentation. child.addServletContainerInitializer(initializer, emptySet()) // perform some specific health check Spring boot autoconfigures the cache infrastructure as long as caching support is enabled via the @EnableCaching annotation. import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer import org.springframework.context.annotation.Bean How to add entire table to cache in spring. Cloud Foundry Self-signed Certificates, expose them (make them remotely accessible) over HTTP or JMX, how probes behave during the application lifecycle, readiness state of an application instance, application events during startup and shutdown, graceful shutdown processes in-flight requests, expose endpoints by using a different HTTP port, Spring Boot Auto Configuration for R2DBC Observation, Spring Framework reference documentation for more information on produced observations, setting handled exceptions as request attributes, To learn more about the Actuators endpoints and their request and response formats, see the separate API documentation (, Disabled endpoints are removed entirely from the application context. In Micrometer 1.9.x, this was fixed by introducing Dynatrace-specific summary instruments. If you open a web browser to localhost:8080, you should see the following output: Behind the scenes, an observation has been created for the HTTP request, which in turn gets bridged to OpenTelemetry, which reports a new trace to Zipkin. In the spring-boot module, you can find two classes to create files that are often useful for process monitoring: ApplicationPidFileWriter creates a file that contains the application PID (by default, in the application directory with a file name of application.pid). import org.springframework.boot.SpringApplication; { 1. In other words, if jvm.memory.max appears as jvm_memory_max in Prometheus because of its snake case naming convention, you should still use jvm.memory.max as the selector when inspecting the meter in the metrics endpoint. Spring Boot public void contribute(Info.Builder builder) { class MyConnectionPoolTagsProviderConfiguration { By clicking Accept all cookies, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy. The following gauge metrics are created for the connection pool: mongodb.driver.pool.size reports the current size of the connection pool, including idle and and in-use members. You can choose to manage and monitor your application by using HTTP endpoints or with JMX. import org.springframework.context.annotation.Bean; "; import jakarta.servlet.ServletException; cache For production environments, we recommend using a production-ready tracing or observability solution, such as Zipkin or OpenTelemetry. Observability for JDBC and R2DBC can be configured using separate projects. Exposes any property from the Environment whose name starts with info.. If both Jersey and Spring MVC are available, Spring MVC is used. Exposes the Readiness application availability state. data import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer Putting them in the cache with the To export metrics to SaaS Stackdriver, you must provide your Google Cloud project ID: You can also change the interval at which metrics are sent to Stackdriver: The StatsD registry eagerly pushes metrics over UDP to a StatsD agent. What is in a name Spring Cloud Azure Cache for Redis samples, More info about Internet Explorer and Microsoft Edge, Quickstart: Create an open-source Redis cache, Quickstart: Use Azure Cache for Redis in Java, Deploy your first application to Azure Spring Apps, Spring Cloud Azure Cache for Redis samples. import org.springframework.context.annotation.Configuration; The following example application.properties does not allow remote management connections: If you do not want to expose endpoints over HTTP, you can set the management port to -1, as the following example shows: You can also achieve this by using the management.endpoints.web.exposure.exclude property, as the following example shows: Java Management Extensions (JMX) provide a standard mechanism to monitor and manage applications. This framework is a simple key-value based distributed database built in-memory. To disable the discovery page, add the following property to your application properties: When a custom management context path is configured, the discovery page automatically moves from /actuator to the root of the management context. What is a distributed caching system? If you expect the Cloud Foundry endpoints to always be available at /cloudfoundryapplication/*, regardless of the servers context-path, you need to explicitly configure that in your application. Application Lifecycle and Probe States, 3.1. Start Tableau and under Connect, select Other Databases (JDBC). Spring boot cache not working in @PostConstruct, Spring cache using @Cacheable not working on startup @PostConstruct. Now I'm using it more late in the startup process and it works without problems: An option would be to use the CommandLineRunner for populating the cache on startup. How to configure port for a Spring Boot application, Making explicit calls to the default Spring Cache Manager provided by SpringBoot. If you deploy applications behind a firewall, you may prefer that all your actuator endpoints can be accessed without requiring authentication. For example, to expose everything over HTTP except the env and beans endpoints, use the following properties: For security purposes, only the /health endpoint is exposed over HTTP by default. WebSpring Boot exposes the most suitable MBeanServer as a bean with an ID of mbeanServer. Get smarter at building your thing. private ServletContainerInitializer getServletContextInitializer(String contextPath) { } Health information is collected from the content of a HealthContributorRegistry (by default, all HealthContributor instances defined in your ApplicationContext).
Passionate about new technologies and ideas, enjoy coding and dive into a task until deep understanding. Spring and Spring Boot. Spring Boot How to load initial data on startup Now the cached data size that is causing issue is about 200-300KB. An operation on a web endpoint or a web-specific endpoint extension can receive the current java.security.Principal or org.springframework.boot.actuate.endpoint.SecurityContext as a method parameter. Here, primary itself is a composite and the HealthContributor with the name b will be excluded from the custom group. To customize the tags when using WebClient, provide a @Bean that implements ClientRequestObservationConvention from the org.springframework.web.reactive.function.client package. import org.springframework.context.annotation.Bean; http.httpBasic() Gauge.builder("queueSize", queue::size).register(registry) The following example sets the export interval to 30 seconds: You can find more information on how to set up the Dynatrace exporter for Micrometer in the Micrometer documentation and the Dynatrace documentation. Auto-configuration enables the instrumentation of all requests handled by the Jersey JAX-RS implementation. The first step is to add the Redis dependencies to your, Spring-boot-starter-data-redis (Redis itself), Jedis (Used to communicate with the Redis server). } The /cloudfoundryapplication path provides an alternative secured route to all @Endpoint beans. import org.springframework.context.annotation.Bean } public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) { or logback.events. The outcome of the command (SUCCESS or FAILED). (At least I think that was the issue). import org.apache.catalina.Host int errorCode = check(); public class MyMeterRegistryConfiguration { Janardhan Nallapati - Senior Manager Technology - Publicis As the order of common tags cannot be guaranteed by using this approach, Graphite users are advised to define a custom, To learn more about Micrometer Tracing capabilities, see its, You can include the current trace and span id in the logs by setting the, If your project doesnt use Spring MVC or Spring WebFlux, the, If you want to create a span without creating a metric, you need to use the. InMemoryHttpExchangeRepository is limited compared to tracing solutions, and we recommend using it only for development environments. import jakarta.servlet.GenericServlet; class CustomObservation { A distributed caching system aggregates the RAMs of numerous computers connected to a network. public class MyBean { It consists of the three pillars logging, metrics and traces. The below diagram shows how Spring Boot will be interconnected with Redis: In the example below, we will have two services communicating with each other, service A (Client Service) with service B (Address Service). Spring Cache Abstraction with multi-value queries. To export metrics to SignalFx, you must provide your access token: You can also change the interval at which metrics are sent to SignalFx: Micrometer ships with a simple, in-memory backend that is automatically used as a fallback if no other registry is configured. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { By default, Spring Boot also exposes management endpoints as JMX MBeans under the org.springframework.boot domain. Spring Integration automatically provides Micrometer support whenever a MeterRegistry bean is available. }. @Bean }. Once Spring Security is in play, Spring Boot Actuator has a flexible audit framework that publishes events (by default, authentication success, failure and access denied exceptions). If the liveness state of an application is broken, Kubernetes tries to solve that problem by restarting the application instance. Metrics for Jettys Connector instances are bound by using Micrometers JettyConnectionMetrics and, when server.ssl.enabled is set to true, Micrometers JettySslHandshakeMetrics. @Throws(ServletException::class, IOException::class) Caching is a well-known concept, and it has existed for a very long time. The spring-boot-actuator module provides all of Spring Boots production-ready features. By default, the final system health is derived by a StatusAggregator, which sorts the statuses from each HealthIndicator based on an ordered list of statuses. Thanks for contributing an answer to Stack Overflow! You'll see logs similar to the following example: Now that you have the Spring Boot application running locally, it's time to move it to production. To configure the enablement of an endpoint, use its management.endpoint..enabled property. Range requests are not supported when using Jersey. For example, an application status page can include full health information instead of the typical running or stopped status. this.observationRegistry = observationRegistry; class MyReactiveHealthIndicator : ReactiveHealthIndicator { } return But it's also one that causes multiple problems. import org.apache.catalina.startup.Tomcat.FixContextListener CORS support is disabled by default and is only enabled once you have set the management.endpoints.web.cors.allowed-origins property. } Exposes properties from Springs ConfigurableEnvironment. protected void prepareContext(Host host, ServletContextInitializer[] initializers) { For Tomcat, you can add the following configuration: You might want to read about graphing tools such as Graphite. // Execute business logic here The application performs startup tasks and does not receive traffic yet. return new GraphiteMeterRegistry(config, clock, this::toHierarchicalName); Cache instrumentation is standardized for a basic set of metrics. See, If you publish metrics to a Wavefront proxy (as described in, In some cases, exceptions handled in web controllers are not recorded as request metrics tags. Guide on Loading Initial Data with Spring Boot | Baeldung
Dreamworld River Rapids Bodies, Articles S
Passionate about new technologies and ideas, enjoy coding and dive into a task until deep understanding. Spring and Spring Boot. Spring Boot How to load initial data on startup Now the cached data size that is causing issue is about 200-300KB. An operation on a web endpoint or a web-specific endpoint extension can receive the current java.security.Principal or org.springframework.boot.actuate.endpoint.SecurityContext as a method parameter. Here, primary itself is a composite and the HealthContributor with the name b will be excluded from the custom group. To customize the tags when using WebClient, provide a @Bean that implements ClientRequestObservationConvention from the org.springframework.web.reactive.function.client package. import org.springframework.context.annotation.Bean; http.httpBasic() Gauge.builder("queueSize", queue::size).register(registry) The following example sets the export interval to 30 seconds: You can find more information on how to set up the Dynatrace exporter for Micrometer in the Micrometer documentation and the Dynatrace documentation. Auto-configuration enables the instrumentation of all requests handled by the Jersey JAX-RS implementation. The first step is to add the Redis dependencies to your, Spring-boot-starter-data-redis (Redis itself), Jedis (Used to communicate with the Redis server). } The /cloudfoundryapplication path provides an alternative secured route to all @Endpoint beans. import org.springframework.context.annotation.Bean } public JmxMeterRegistry jmxMeterRegistry(JmxConfig config, Clock clock) { or logback.events. The outcome of the command (SUCCESS or FAILED). (At least I think that was the issue). import org.apache.catalina.Host int errorCode = check(); public class MyMeterRegistryConfiguration { Janardhan Nallapati - Senior Manager Technology - Publicis As the order of common tags cannot be guaranteed by using this approach, Graphite users are advised to define a custom, To learn more about Micrometer Tracing capabilities, see its, You can include the current trace and span id in the logs by setting the, If your project doesnt use Spring MVC or Spring WebFlux, the, If you want to create a span without creating a metric, you need to use the. InMemoryHttpExchangeRepository is limited compared to tracing solutions, and we recommend using it only for development environments. import jakarta.servlet.GenericServlet; class CustomObservation { A distributed caching system aggregates the RAMs of numerous computers connected to a network. public class MyBean { It consists of the three pillars logging, metrics and traces. The below diagram shows how Spring Boot will be interconnected with Redis: In the example below, we will have two services communicating with each other, service A (Client Service) with service B (Address Service). Spring Cache Abstraction with multi-value queries. To export metrics to SignalFx, you must provide your access token: You can also change the interval at which metrics are sent to SignalFx: Micrometer ships with a simple, in-memory backend that is automatically used as a fallback if no other registry is configured. public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { By default, Spring Boot also exposes management endpoints as JMX MBeans under the org.springframework.boot domain. Spring Integration automatically provides Micrometer support whenever a MeterRegistry bean is available. }. @Bean }. Once Spring Security is in play, Spring Boot Actuator has a flexible audit framework that publishes events (by default, authentication success, failure and access denied exceptions). If the liveness state of an application is broken, Kubernetes tries to solve that problem by restarting the application instance. Metrics for Jettys Connector instances are bound by using Micrometers JettyConnectionMetrics and, when server.ssl.enabled is set to true, Micrometers JettySslHandshakeMetrics. @Throws(ServletException::class, IOException::class) Caching is a well-known concept, and it has existed for a very long time. The spring-boot-actuator module provides all of Spring Boots production-ready features. By default, the final system health is derived by a StatusAggregator, which sorts the statuses from each HealthIndicator based on an ordered list of statuses. Thanks for contributing an answer to Stack Overflow! You'll see logs similar to the following example: Now that you have the Spring Boot application running locally, it's time to move it to production. To configure the enablement of an endpoint, use its management.endpoint.
Dreamworld River Rapids Bodies, Articles S