About Reports

Metering is a deprecated feature. Deprecated functionality is still included in OKD and continues to be supported; however, it will be removed in a future release of this product and is not recommended for new deployments.

For the most recent list of major functionality that has been deprecated or removed within OKD, refer to the Deprecated and removed features section of the OKD release notes.

A Report custom resource provides a method to manage periodic Extract Transform and Load (ETL) jobs using SQL queries. Reports are composed from other metering resources, such as ReportQuery resources that provide the actual SQL query to run, and ReportDataSource resources that define the data available to the ReportQuery and Report resources.

Many use cases are addressed by the predefined ReportQuery and ReportDataSource resources that come installed with metering. Therefore, you do not need to define your own unless you have a use case that is not covered by these predefined resources.

Reports

The Report custom resource is used to manage the execution and status of reports. Metering produces reports derived from usage data sources, which can be used in further analysis and filtering. A single Report resource represents a job that manages a database table and updates it with new information according to a schedule. The report exposes the data in that table via the Reporting Operator HTTP API.

Reports with a spec.schedule field set are always running and track what time periods it has collected data for. This ensures that if metering is shutdown or unavailable for an extended period of time, it backfills the data starting where it left off. If the schedule is unset, then the report runs once for the time specified by the reportingStart and reportingEnd. By default, reports wait for ReportDataSource resources to have fully imported any data covered in the reporting period. If the report has a schedule, it waits to run until the data in the period currently being processed has finished importing.

Example report with a schedule

The following example Report object contains information on every pod’s CPU requests, and runs every hour, adding the last hours worth of data each time it runs.

  1. apiVersion: metering.openshift.io/v1
  2. kind: Report
  3. metadata:
  4. name: pod-cpu-request-hourly
  5. spec:
  6. query: "pod-cpu-request"
  7. reportingStart: "2019-07-01T00:00:00Z"
  8. schedule:
  9. period: "hourly"
  10. hourly:
  11. minute: 0
  12. second: 0

Example report without a schedule (run-once)

The following example Report object contains information on every pod’s CPU requests for all of July. After completion, it does not run again.

  1. apiVersion: metering.openshift.io/v1
  2. kind: Report
  3. metadata:
  4. name: pod-cpu-request-hourly
  5. spec:
  6. query: "pod-cpu-request"
  7. reportingStart: "2019-07-01T00:00:00Z"
  8. reportingEnd: "2019-07-31T00:00:00Z"

query

The query field names the ReportQuery resource used to generate the report. The report query controls the schema of the report as well as how the results are processed.

query is a required field.

Use the following command to list available ReportQuery resources:

  1. $ oc -n openshift-metering get reportqueries

Example output

  1. NAME AGE
  2. cluster-cpu-capacity 23m
  3. cluster-cpu-capacity-raw 23m
  4. cluster-cpu-usage 23m
  5. cluster-cpu-usage-raw 23m
  6. cluster-cpu-utilization 23m
  7. cluster-memory-capacity 23m
  8. cluster-memory-capacity-raw 23m
  9. cluster-memory-usage 23m
  10. cluster-memory-usage-raw 23m
  11. cluster-memory-utilization 23m
  12. cluster-persistentvolumeclaim-request 23m
  13. namespace-cpu-request 23m
  14. namespace-cpu-usage 23m
  15. namespace-cpu-utilization 23m
  16. namespace-memory-request 23m
  17. namespace-memory-usage 23m
  18. namespace-memory-utilization 23m
  19. namespace-persistentvolumeclaim-request 23m
  20. namespace-persistentvolumeclaim-usage 23m
  21. node-cpu-allocatable 23m
  22. node-cpu-allocatable-raw 23m
  23. node-cpu-capacity 23m
  24. node-cpu-capacity-raw 23m
  25. node-cpu-utilization 23m
  26. node-memory-allocatable 23m
  27. node-memory-allocatable-raw 23m
  28. node-memory-capacity 23m
  29. node-memory-capacity-raw 23m
  30. node-memory-utilization 23m
  31. persistentvolumeclaim-capacity 23m
  32. persistentvolumeclaim-capacity-raw 23m
  33. persistentvolumeclaim-phase-raw 23m
  34. persistentvolumeclaim-request 23m
  35. persistentvolumeclaim-request-raw 23m
  36. persistentvolumeclaim-usage 23m
  37. persistentvolumeclaim-usage-raw 23m
  38. persistentvolumeclaim-usage-with-phase-raw 23m
  39. pod-cpu-request 23m
  40. pod-cpu-request-raw 23m
  41. pod-cpu-usage 23m
  42. pod-cpu-usage-raw 23m
  43. pod-memory-request 23m
  44. pod-memory-request-raw 23m
  45. pod-memory-usage 23m
  46. pod-memory-usage-raw 23m

Report queries with the -raw suffix are used by other ReportQuery resources to build more complex queries, and should not be used directly for reports.

namespace- prefixed queries aggregate pod CPU and memory requests by namespace, providing a list of namespaces and their overall usage based on resource requests.

pod- prefixed queries are similar to namespace- prefixed queries but aggregate information by pod rather than namespace. These queries include the pod’s namespace and node.

node- prefixed queries return information about each node’s total available resources.

aws- prefixed queries are specific to AWS. Queries suffixed with -aws return the same data as queries of the same name without the suffix, and correlate usage with the EC2 billing data.

The aws-ec2-billing-data report is used by other queries, and should not be used as a standalone report. The aws-ec2-cluster-cost report provides a total cost based on the nodes included in the cluster, and the sum of their costs for the time period being reported on.

Use the following command to get the ReportQuery resource as YAML, and check the spec.columns field. For example, run:

  1. $ oc -n openshift-metering get reportqueries namespace-memory-request -o yaml

Example output

  1. apiVersion: metering.openshift.io/v1
  2. kind: ReportQuery
  3. metadata:
  4. name: namespace-memory-request
  5. labels:
  6. operator-metering: "true"
  7. spec:
  8. columns:
  9. - name: period_start
  10. type: timestamp
  11. unit: date
  12. - name: period_end
  13. type: timestamp
  14. unit: date
  15. - name: namespace
  16. type: varchar
  17. unit: kubernetes_namespace
  18. - name: pod_request_memory_byte_seconds
  19. type: double
  20. unit: byte_seconds

schedule

The spec.schedule configuration block defines when the report runs. The main fields in the schedule section are period, and then depending on the value of period, the fields hourly, daily, weekly, and monthly allow you to fine-tune when the report runs.

For example, if period is set to weekly, you can add a weekly field to the spec.schedule block. The following example will run once a week on Wednesday, at 1 PM (hour 13 in the day).

  1. ...
  2. schedule:
  3. period: "weekly"
  4. weekly:
  5. dayOfWeek: "wednesday"
  6. hour: 13
  7. ...

period

Valid values of schedule.period are listed below, and the options available to set for a given period are also listed.

  • hourly

    • minute

    • second

  • daily

    • hour

    • minute

    • second

  • weekly

    • dayOfWeek

    • hour

    • minute

    • second

  • monthly

    • dayOfMonth

    • hour

    • minute

    • second

  • cron

    • expression

Generally, the hour, minute, second fields control when in the day the report runs, and dayOfWeek/dayOfMonth control what day of the week, or day of month the report runs on, if it is a weekly or monthly report period.

For each of these fields, there is a range of valid values:

  • hour is an integer value between 0-23.

  • minute is an integer value between 0-59.

  • second is an integer value between 0-59.

  • dayOfWeek is a string value that expects the day of the week (spelled out).

  • dayOfMonth is an integer value between 1-31.

For cron periods, normal cron expressions are valid:

  • expression: "*/5 * * * *"

reportingStart

To support running a report against existing data, you can set the spec.reportingStart field to a RFC3339 timestamp to tell the report to run according to its schedule starting from reportingStart rather than the current time.

Setting the spec.reportingStart field to a specific time will result in the Reporting Operator running many queries in succession for each interval in the schedule that is between the reportingStart time and the current time. This could be thousands of queries if the period is less than daily and the reportingStart is more than a few months back. If reportingStart is left unset, the report will run at the next full reportingPeriod after the time the report is created.

As an example of how to use this field, if you had data already collected dating back to January 1st, 2019 that you want to include in your Report object, you can create a report with the following values:

  1. apiVersion: metering.openshift.io/v1
  2. kind: Report
  3. metadata:
  4. name: pod-cpu-request-hourly
  5. spec:
  6. query: "pod-cpu-request"
  7. schedule:
  8. period: "hourly"
  9. reportingStart: "2019-01-01T00:00:00Z"

reportingEnd

To configure a report to only run until a specified time, you can set the spec.reportingEnd field to an RFC3339 timestamp. The value of this field will cause the report to stop running on its schedule after it has finished generating reporting data for the period covered from its start time until reportingEnd.

Because a schedule will most likely not align with the reportingEnd, the last period in the schedule will be shortened to end at the specified reportingEnd time. If left unset, then the report will run forever, or until a reportingEnd is set on the report.

For example, if you want to create a report that runs once a week for the month of July:

  1. apiVersion: metering.openshift.io/v1
  2. kind: Report
  3. metadata:
  4. name: pod-cpu-request-hourly
  5. spec:
  6. query: "pod-cpu-request"
  7. schedule:
  8. period: "weekly"
  9. reportingStart: "2019-07-01T00:00:00Z"
  10. reportingEnd: "2019-07-31T00:00:00Z"

expiration

Add the expiration field to set a retention period on a scheduled metering report. You can avoid manually removing the report by setting the expiration duration value. The retention period is equal to the Report object creationDate plus the expiration duration. The report is removed from the cluster at the end of the retention period if no other reports or report queries depend on the expiring report. Deleting the report from the cluster can take several minutes.

Setting the expiration field is not recommended for roll-up or aggregated reports. If a report is depended upon by other reports or report queries, then the report is not removed at the end of the retention period. You can view the report-operator logs at debug level for the timing output around a report retention decision.

For example, the following scheduled report is deleted 30 minutes after the creationDate of the report:

  1. apiVersion: metering.openshift.io/v1
  2. kind: Report
  3. metadata:
  4. name: pod-cpu-request-hourly
  5. spec:
  6. query: "pod-cpu-request"
  7. schedule:
  8. period: "weekly"
  9. reportingStart: "2020-09-01T00:00:00Z"
  10. expiration: "30m" (1)
1Valid time units for the expiration duration are ns, us (or µs), ms, s, m, and h.

The expiration retention period for a Report object is not precise and works on the order of several minutes, not nanoseconds.

runImmediately

When runImmediately is set to true, the report runs immediately. This behavior ensures that the report is immediately processed and queued without requiring additional scheduling parameters.

When runImmediately is set to true, you must set a reportingEnd and reportingStart value.

inputs

The spec.inputs field of a Report object can be used to override or set values defined in a ReportQuery resource’s spec.inputs field.

spec.inputs is a list of name-value pairs:

  1. spec:
  2. inputs:
  3. - name: "NamespaceCPUUsageReportName" (1)
  4. value: "namespace-cpu-usage-hourly" (2)
1The name of an input must exist in the ReportQuery’s inputs list.
2The value of the input must be the correct type for the input’s type.

Roll-up reports

Report data is stored in the database much like metrics themselves, and therefore, can be used in aggregated or roll-up reports. A simple use case for a roll-up report is to spread the time required to produce a report over a longer period of time. This is instead of requiring a monthly report to query and add all data over an entire month. For example, the task can be split into daily reports that each run over 1/30 of the data.

A custom roll-up report requires a custom report query. The ReportQuery resource template processor provides a reportTableName function that can get the necessary table name from a Report object’s metadata.name.

Below is a snippet taken from a built-in query:

pod-cpu.yaml

  1. spec:
  2. ...
  3. inputs:
  4. - name: ReportingStart
  5. type: time
  6. - name: ReportingEnd
  7. type: time
  8. - name: NamespaceCPUUsageReportName
  9. type: Report
  10. - name: PodCpuUsageRawDataSourceName
  11. type: ReportDataSource
  12. default: pod-cpu-usage-raw
  13. ...
  14. query: |
  15. ...
  16. {|- if .Report.Inputs.NamespaceCPUUsageReportName |}
  17. namespace,
  18. sum(pod_usage_cpu_core_seconds) as pod_usage_cpu_core_seconds
  19. FROM {| .Report.Inputs.NamespaceCPUUsageReportName | reportTableName |}
  20. ...

Example aggregated-report.yaml roll-up report

  1. spec:
  2. query: "namespace-cpu-usage"
  3. inputs:
  4. - name: "NamespaceCPUUsageReportName"
  5. value: "namespace-cpu-usage-hourly"

Report status

The execution of a scheduled report can be tracked using its status field. Any errors occurring during the preparation of a report will be recorded here.

The status field of a Report object currently has two fields:

  • conditions: Conditions is a list of conditions, each of which have a type, status, reason, and message field. Possible values of a condition’s type field are Running and Failure, indicating the current state of the scheduled report. The reason indicates why its condition is in its current state with the status being either true, false or, unknown. The message provides a human readable indicating why the condition is in the current state. For detailed information on the reason values, see pkg/apis/metering/v1/util/report_util.go.

  • lastReportTime: Indicates the time metering has collected data up to.