number of instances the cloud foundry app is running

我怕爱的太早我们不能终老 提交于 2019-12-05 02:38:22

问题


my app needs to get the number of instances in which its running, (in runtime my app uses this info in my program logic). (VCAP_APPLICATION env variables cannot provide this info. ) Calling API directly and using "instances" attribute is an option, but I dont know how to call apps API directly in my app. Please let me know how to call it. Below is the link I got for app API: http://apidocs.cloudfoundry.org/218/apps/retrieve_a_particular_app.html


回答1:


In order to use the API, you first need to authenticate. In order to authenticate, you need to retrieve the authorization endpoint.

To retrieve the authorization endpoint, issue the following curl request (I am using pivotal web services in this example, but you would replace https://api.run.pivotal.io with the cloud foundry api endpoint you are using.

curl -H 'content-type: application/x-www-form-urlencoded;charset=utf-8' \
-H 'accept: application/json;charset=utf-8' \
https://api.run.pivotal.io/v2/info

You'll get back something that looks like this:

{
"name": "vcap",
"build": "2222",
"support": "http://support.cloudfoundry.com",
"version": 2,
"description": "Cloud Foundry sponsored by Pivotal",
"authorization_endpoint": "https://login.run.pivotal.io",
"token_endpoint": "https://uaa.run.pivotal.io",
"min_cli_version": null,
"min_recommended_cli_version": null,
"api_version": "2.36.0",
"app_ssh_endpoint": "ssh.run.pivotal.io:2222",
"app_ssh_host_key_fingerprint": "e7:13:4e:32:ee:39:62:df:54:41:d7:f7:8b:b2:a7:6b",
"logging_endpoint": "wss://loggregator.run.pivotal.io:443",
"doppler_logging_endpoint": "wss://doppler.run.pivotal.io:443"
}

Grab the authorization_endpoint value, in this case it is:

https://login.run.pivotal.io

You now need to grab an authentication token. Issue the following curl command replacing the [my user name] and [my password] and [my authorization endpoint] with your values. Please note that you should url encode your password.

curl -H 'content-type: application/x-www-form-urlencoded;charset=utf-8' \
-H 'accept: application/json;charset=utf-8' \
-H 'authorization: Basic Y2Y6' \
-d "username=[my user name]&password=[my password]&grant_type=password" \
[my authorization endpoint]/oauth/token

You will get a response that looks like this:

{
"access_token": "very_long_token.very_long_token.very_long_token",
"token_type": "bearer",
"refresh_token": "very_long_token.very_long_token.very_long_token",
"expires_in": 599,
"scope": "cloud_controller.read password.write cloud_controller.write openid",
"jti": "shorter_value"
}

You are interested in the access_token value (access_token, refresh_token, and jti have been changed from the actual values in this example)

Now we are finally at the point where we can use the api to get the information about our app. You could use the link you provided above, but to use that api endpoint, you need the guid of your app. Instead I would recommend using the List all Apps endpoint and use a query filter on it to get your app information. Here is the curl command (replace [my authorization token] with your auth token from the previous step, replace [my api endpoint] with the api endpoint you use for cloud foundry, replace [my app name] with the name of your app:

curl -H "authorization: bearer [my authorization token]" \
[my api endpoint]/v2/apps?q=name:[my app name] -X GET

You'll receive a message that looks like this:

{
"total_results": 1,
"total_pages": 1,
"prev_url": null,
"next_url": null,
"resources": [
{
  "metadata": {
    "guid": "blah-blah",
    "url": "/v2/apps/blah-blah",
    "created_at": "time_stamp",
    "updated_at": null
  },
  "entity": {
    "name": "my-app",
    "production": false,
    "space_guid": "blah-blah",
    "stack_guid": "blah-blah",
    "buildpack": null,
    "detected_buildpack": null,
    "environment_json": {

    },
    "memory": 1024,
    "instances": 3,
    "disk_quota": 1024,
    "state": "STOPPED",
    "version": "blah-blah",
    "command": null,
    "console": false,
    "debug": null,
    "staging_task_id": null,
    "package_state": "STAGED",
    "health_check_type": "port",
    "health_check_timeout": null,
    "staging_failed_reason": null,
    "staging_failed_description": null,
    "diego": false,
    "docker_image": null,
    "package_updated_at": "time stamp",
    "detected_start_command": "",
    "enable_ssh": true,
    "docker_credentials_json": {
      "redacted_message": "[PRIVATE DATA HIDDEN]"
    },
    "space_url": "/v2/spaces/blah-blah",
    "stack_url": "/v2/stacks/blah-blah",
    "events_url": "/v2/apps/blah-blah/events",
    "service_bindings_url": "/v2/apps/blah-blah/service_bindings",
    "routes_url": "/v2/apps/blah-blah/routes"
  }
}
]
}

You can grab the instances from the message. If you want to use the api in your original link, you can grab the metadata.guid for use in that call.

Hope that helps!




回答2:


I was looking for something similar but using cf cli, to get the instance count of my app in a shell script. I came up with this and it works.

cf app my_app_name|grep instances|cut -d'/' -f2

I understand this post might not be related, but i would be happy if it helps someone.



来源:https://stackoverflow.com/questions/32868377/number-of-instances-the-cloud-foundry-app-is-running

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!