Как измерить использование полосы пропускания на пользователя в облачном хранилище Google? - PullRequest
2 голосов
/ 02 июля 2019

Мы хотим взимать плату с пользователей в зависимости от объема трафика, который имеют их данные. На самом деле количество полосы пропускания в нисходящем направлении, которую используют их данные.

Я экспортировал облачное хранилище Google access_logs. Из журналов я могу подсчитать, сколько раз файл был доступен. (размер файла * количество будет использовать пропускную способность)

Но проблема в том, что это плохо работает с кэшированным контентом. Мое вычисленное значение намного больше, чем фактическое использование.

Я пошел с этим методом, потому что наш трафик будет новым и не будет использовать кеш, а это значит, что разница не будет иметь значения. Но на самом деле кажется, что это настоящая проблема.

Это общий случай использования, и я думаю, что должен быть лучший способ решить эту проблему с облачным хранилищем Google.

{
  "insertId": "-tohip8e1vmvw",
  "logName": "projects/bucket/logs/cloudaudit.googleapis.com%2Fdata_access",
  "protoPayload": {
    "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
    "authenticationInfo": {
      "principalEmail": "firebase-storage@system.gserviceaccount.com"
    },
    "authorizationInfo": [
      {
        "granted": true,
        "permission": "storage.objects.get",
        "resource": "projects/_/bucket/bucket.appspot.com/objects/users/2y7aPImLYeTsCt6X0dwNMlW9K5h1/somefile",
        "resourceAttributes": {}
      },
      {
        "granted": true,
        "permission": "storage.objects.getIamPolicy",
        "resource": "projects/_/bucket/bucket.appspot.com/objects/users/2y7aPImLYeTsCt6X0dwNMlW9K5h1/somefile",
        "resourceAttributes": {}
      }
    ],
    "methodName": "storage.objects.get",
    "requestMetadata": {
      "destinationAttributes": {},
      "requestAttributes": {
        "auth": {},
        "time": "2019-07-02T11:58:36.068Z"
      }
    },
    "resourceLocation": {
      "currentLocations": [
        "eu"
      ]
    },
    "resourceName": "projects/_/bucket/bucket.appspot.com/objects/users/2y7aPImLYeTsCt6X0dwNMlW9K5h1/somefile",
    "serviceName": "storage.googleapis.com",
    "status": {}
  },
  "receiveTimestamp": "2019-07-02T11:58:36.412798307Z",
  "resource": {
    "labels": {
      "bucket_name": "bucket.appspot.com",
      "location": "eu",
      "project_id": "project-id"
    },
    "type": "gcs_bucket"
  },
  "severity": "INFO",
  "timestamp": "2019-07-02T11:58:36.062Z"
}

Запись в журнале.

Мы сейчас используем одно ведро. Можно также использовать несколько, если это помогает.

1 Ответ

0 голосов
/ 06 июля 2019

Одна возможность состоит в том, чтобы иметь отдельную корзину для каждого пользователя и получать пропускную способность корзины через timeseries api .

Конечная точка для этой цели:

https://cloud.google.com/monitoring/api/ref_v3/rest/v3/projects.timeSeries/list

И следующие параметры для достижения байтов, отправленных за один час (мы можем указать диапазон времени выше 60 с), чьисумма будет общим количеством байтов, отправленных из корзины.

{
  "dataSets": [
    {
      "timeSeriesFilter": {
        "filter": "metric.type=\"storage.googleapis.com/network/sent_bytes_count\" resource.type=\"gcs_bucket\" resource.label.\"project_id\"=\"<<<< project id here >>>>\" resource.label.\"bucket_name\"=\"<<<< bucket name here >>>>\"",
        "perSeriesAligner": "ALIGN_SUM",
        "crossSeriesReducer": "REDUCE_SUM",
        "secondaryCrossSeriesReducer": "REDUCE_SUM",
        "minAlignmentPeriod": "3600s",
        "groupByFields": [
          "resource.label.\"bucket_name\""
        ],
        "unitOverride": "By"
      },
      "targetAxis": "Y1",
      "plotType": "LINE",
      "legendTemplate": "${resource.labels.bucket_name}"
    }
  ],
  "options": {
    "mode": "COLOR"
  },
  "constantLines": [],
  "timeshiftDuration": "0s",
  "y1Axis": {
    "label": "y1Axis",
    "scale": "LINEAR"
  }
}

...