Exercising the Deployed Example Application
Once you have the sensor-data
Cloudflow application deployed, you can use some CLI helpers to monitor the status of your application.
-
--help to see all options available
$ kubectl cloudflow --help This command line tool can be used to deploy and operate Cloudflow applications. Usage: cloudflow [command] Available Commands: configure Configures a deployed Cloudflow application. deploy Deploys a Cloudflow application to the cluster. help Help about any command list Lists deployed Cloudflow application in the current cluster. scale Scales a streamlet of a deployed Cloudflow application to the specified number of replicas. status Gets the status of a Cloudflow application. undeploy Undeploys a Cloudflow application. update-docker-credentials Updates docker registry credentials that are used to pull Cloudflow application images. version Prints the plugin version. Flags: -h, --help help for cloudflow Use "cloudflow [command] --help" for more information about a command.
-
list shows all applications deployed in the cluster
$ kubectl cloudflow list NAME NAMESPACE VERSION CREATION-TIME sensor-data-scala sensor-data-scala 484-199a3c1 2020-06-10 22:28:32 +0200 CEST
-
status shows details of a running application
$ kubectl cloudflow status sensor-data-scala Name: sensor-data-scala Namespace: sensor-data-scala Version: 484-199a3c1 Created: 2020-06-10 22:28:32 +0200 CEST Status: Running STREAMLET POD READY STATUS RESTARTS http-ingress sensor-data-scala-http-ingress-86dd5b8747-vnmxq 1/1 Running 0 invalid-logger sensor-data-scala-invalid-logger-789d679855-9l7qz 1/1 Running 0 metrics sensor-data-scala-metrics-6b7475c4f9-sxxw6 1/1 Running 0 valid-logger sensor-data-scala-valid-logger-78594f47ff-v82zt 1/1 Running 0 validation sensor-data-scala-validation-d8858dff-6xswj 1/1 Running 0
Push data to the Application
Our application uses an http based ingress to ingest data. Follow the following steps to push JSON data through the ingress into the application.
-
Get the port details of our ingress streamlet
$ kubectl describe pod -n sensor-data-scala sensor-data-http-ingress-fd9cdb66f-jbsrm
Name: sensor-data-http-ingress-fd9cdb66f-jbsrm
Namespace: sensor-data-scala
Priority: 0
PriorityClassName: <none>
Node: gke-dg-gke-1-default-pool-162a09d5-ddnq/10.132.0.21
Start Time: Tue, 12 Nov 2019 12:47:20 +0530
Labels: app.kubernetes.io/component=streamlet
app.kubernetes.io/managed-by=cloudflow
app.kubernetes.io/name=sensor-data-http-ingress
app.kubernetes.io/part-of=sensor-data
app.kubernetes.io/version=2-89ce8a7
com.lightbend.cloudflow/app-id=sensor-data
com.lightbend.cloudflow/streamlet-name=http-ingress
pod-template-hash=fd9cdb66f
Annotations: prometheus.io/scrape: true
Status: Running
IP: 10.44.1.6
Controlled By: ReplicaSet/sensor-data-http-ingress-fd9cdb66f
Containers:
sensor-data-http-ingress:
Container ID: docker://9149cd757094e7ea1b943076048b7efc7aa343da8c2d598bba31295ef3cbfd6b
Image: eu.gcr.io/bubbly-observer-178213/sensor-data@sha256:ee496e8cf3a3d9ab71c3ef4a4929ed8eeb6129845f981c33005942314ad30f18
Image ID: docker-pullable://eu.gcr.io/bubbly-observer-178213/sensor-data@sha256:ee496e8cf3a3d9ab71c3ef4a4929ed8eeb6129845f981c33005942314ad30f18
Ports: 3000/TCP, 2048/TCP, 2049/TCP, 2050/TCP
...
The streamlet exposes its HTTP endpoint for uploading data on port 3000
- let’s set up a port forwarding on it.
Check the created svc
$ kubectl get svc -n sensor-data-scala NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE sensor-data-scala-http-ingress-service ClusterIP 10.0.22.206 <none> 3000/TCP 1m
Setup local port forwarding for the Pod port
$ kubectl port-forward svc/sensor-data-scala-http-ingress-service -n sensor-data-scala 3000:3000
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
Handling connection for 3000
The port-forward solution used here is a temporary route to the application from localhost. If you want to create a permanent route that can be accessed by anyone, please see the following chapter on Kubernetes ingresses: Providing External Access to Cloudflow Services |
-
Push data to the application. In order to do that follow the steps:
-
create a json file named
data.json
with the following content:data.json{ "deviceId": "c75cb448-df0e-4692-8e06-0321b7703992", "timestamp": 1495545346279, "measurements": { "power": 1.7, "rotorSpeed": 23.4, "windSpeed": 100.1 } }
-
run the following command:
curl -i -X POST http://localhost:3000 -H "Content-Type: application/json" --data @data.json
-
Note that we are using the port number 3000
of localhost
to which we forward the pod port. This JSON record will pass through the stages of transformation within the pipeline that we defined in the blueprint.
When using this port-forward method, it’s also possible to use the same send-local-data.sh
script that we used to send data to the local sandbox.
For that, run the following command:
./send-local-data.sh
And you should see output similar to the following:
Sending {"deviceId":"c75cb448-df0e-4692-8e06-0321b7703992","timestamp":1495545646279,"measurements":{"power":1.7,"rotorSpeed":3.9,"windSpeed":105.9}}
HTTP/1.1 202 Accepted
Server: akka-http/10.1.11
Date: Thu, 11 Jun 2020 10:20:48 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 88
The request has been accepted for processing, but the processing has not been completed.Sending {"deviceId":"c75cb448-df0e-4692-8e06-0321b7703992","timestamp":1495545646279,"measurements":{"power":1.7,"rotorSpeed":3.9,"windSpeed":105.9}}
HTTP/1.1 202 Accepted
Server: akka-http/10.1.11
Date: Thu, 11 Jun 2020 10:20:48 GMT
Content-Type: text/plain; charset=UTF-8
Content-Length: 88
Verify the Application works
Check the log of the streamlet valid-logger
to verify that you get the proper transformed metric.
kubectl logs -n sensor-data-scala sensor-data-valid-logger-76884bb775-86pwh
Towards the end of the log you will see something like the following getting printed out:
[INFO] [06/11/2020 12:20:49.288] [akka_streamlet-akka.actor.default-dispatcher-5] [akka.actor.ActorSystemImpl(akka_streamlet)] valid-logger {"deviceId": "c75cb448-df0e-4692-8e06-0321b7703992", "timestamp": 1495545646279, "name": "rotorSpeed", "value": 3.9}
[INFO] [06/11/2020 12:20:49.293] [akka_streamlet-akka.actor.default-dispatcher-6] [akka.actor.ActorSystemImpl(akka_streamlet)] valid-logger {"deviceId": "c75cb448-df0e-4692-8e06-0321b7703992", "timestamp": 1495545646279, "name": "windSpeed", "value": 105.9}