...

Source file src/k8s.io/kubernetes/pkg/kubelet/kuberuntime/instrumented_services.go

Documentation: k8s.io/kubernetes/pkg/kubelet/kuberuntime

     1  /*
     2  Copyright 2016 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package kuberuntime
    18  
    19  import (
    20  	"context"
    21  	"time"
    22  
    23  	internalapi "k8s.io/cri-api/pkg/apis"
    24  	runtimeapi "k8s.io/cri-api/pkg/apis/runtime/v1"
    25  	"k8s.io/kubernetes/pkg/kubelet/metrics"
    26  )
    27  
    28  // instrumentedRuntimeService wraps the RuntimeService and records the operations
    29  // and errors metrics.
    30  type instrumentedRuntimeService struct {
    31  	service internalapi.RuntimeService
    32  }
    33  
    34  // Creates an instrumented RuntimeInterface from an existing RuntimeService.
    35  func newInstrumentedRuntimeService(service internalapi.RuntimeService) internalapi.RuntimeService {
    36  	return &instrumentedRuntimeService{service: service}
    37  }
    38  
    39  // instrumentedImageManagerService wraps the ImageManagerService and records the operations
    40  // and errors metrics.
    41  type instrumentedImageManagerService struct {
    42  	service internalapi.ImageManagerService
    43  }
    44  
    45  // Creates an instrumented ImageManagerService from an existing ImageManagerService.
    46  func newInstrumentedImageManagerService(service internalapi.ImageManagerService) internalapi.ImageManagerService {
    47  	return &instrumentedImageManagerService{service: service}
    48  }
    49  
    50  // recordOperation records the duration of the operation.
    51  func recordOperation(operation string, start time.Time) {
    52  	metrics.RuntimeOperations.WithLabelValues(operation).Inc()
    53  	metrics.RuntimeOperationsDuration.WithLabelValues(operation).Observe(metrics.SinceInSeconds(start))
    54  }
    55  
    56  // recordError records error for metric if an error occurred.
    57  func recordError(operation string, err error) {
    58  	if err != nil {
    59  		metrics.RuntimeOperationsErrors.WithLabelValues(operation).Inc()
    60  	}
    61  }
    62  
    63  func (in instrumentedRuntimeService) Version(ctx context.Context, apiVersion string) (*runtimeapi.VersionResponse, error) {
    64  	const operation = "version"
    65  	defer recordOperation(operation, time.Now())
    66  
    67  	out, err := in.service.Version(ctx, apiVersion)
    68  	recordError(operation, err)
    69  	return out, err
    70  }
    71  
    72  func (in instrumentedRuntimeService) Status(ctx context.Context, verbose bool) (*runtimeapi.StatusResponse, error) {
    73  	const operation = "status"
    74  	defer recordOperation(operation, time.Now())
    75  
    76  	out, err := in.service.Status(ctx, verbose)
    77  	recordError(operation, err)
    78  	return out, err
    79  }
    80  
    81  func (in instrumentedRuntimeService) CreateContainer(ctx context.Context, podSandboxID string, config *runtimeapi.ContainerConfig, sandboxConfig *runtimeapi.PodSandboxConfig) (string, error) {
    82  	const operation = "create_container"
    83  	defer recordOperation(operation, time.Now())
    84  
    85  	out, err := in.service.CreateContainer(ctx, podSandboxID, config, sandboxConfig)
    86  	recordError(operation, err)
    87  	return out, err
    88  }
    89  
    90  func (in instrumentedRuntimeService) StartContainer(ctx context.Context, containerID string) error {
    91  	const operation = "start_container"
    92  	defer recordOperation(operation, time.Now())
    93  
    94  	err := in.service.StartContainer(ctx, containerID)
    95  	recordError(operation, err)
    96  	return err
    97  }
    98  
    99  func (in instrumentedRuntimeService) StopContainer(ctx context.Context, containerID string, timeout int64) error {
   100  	const operation = "stop_container"
   101  	defer recordOperation(operation, time.Now())
   102  
   103  	err := in.service.StopContainer(ctx, containerID, timeout)
   104  	recordError(operation, err)
   105  	return err
   106  }
   107  
   108  func (in instrumentedRuntimeService) RemoveContainer(ctx context.Context, containerID string) error {
   109  	const operation = "remove_container"
   110  	defer recordOperation(operation, time.Now())
   111  
   112  	err := in.service.RemoveContainer(ctx, containerID)
   113  	recordError(operation, err)
   114  	return err
   115  }
   116  
   117  func (in instrumentedRuntimeService) ListContainers(ctx context.Context, filter *runtimeapi.ContainerFilter) ([]*runtimeapi.Container, error) {
   118  	const operation = "list_containers"
   119  	defer recordOperation(operation, time.Now())
   120  
   121  	out, err := in.service.ListContainers(ctx, filter)
   122  	recordError(operation, err)
   123  	return out, err
   124  }
   125  
   126  func (in instrumentedRuntimeService) ContainerStatus(ctx context.Context, containerID string, verbose bool) (*runtimeapi.ContainerStatusResponse, error) {
   127  	const operation = "container_status"
   128  	defer recordOperation(operation, time.Now())
   129  
   130  	out, err := in.service.ContainerStatus(ctx, containerID, verbose)
   131  	recordError(operation, err)
   132  	return out, err
   133  }
   134  
   135  func (in instrumentedRuntimeService) UpdateContainerResources(ctx context.Context, containerID string, resources *runtimeapi.ContainerResources) error {
   136  	const operation = "update_container"
   137  	defer recordOperation(operation, time.Now())
   138  
   139  	err := in.service.UpdateContainerResources(ctx, containerID, resources)
   140  	recordError(operation, err)
   141  	return err
   142  }
   143  
   144  func (in instrumentedRuntimeService) ReopenContainerLog(ctx context.Context, containerID string) error {
   145  	const operation = "reopen_container_log"
   146  	defer recordOperation(operation, time.Now())
   147  
   148  	err := in.service.ReopenContainerLog(ctx, containerID)
   149  	recordError(operation, err)
   150  	return err
   151  }
   152  
   153  func (in instrumentedRuntimeService) ExecSync(ctx context.Context, containerID string, cmd []string, timeout time.Duration) ([]byte, []byte, error) {
   154  	const operation = "exec_sync"
   155  	defer recordOperation(operation, time.Now())
   156  
   157  	stdout, stderr, err := in.service.ExecSync(ctx, containerID, cmd, timeout)
   158  	recordError(operation, err)
   159  	return stdout, stderr, err
   160  }
   161  
   162  func (in instrumentedRuntimeService) Exec(ctx context.Context, req *runtimeapi.ExecRequest) (*runtimeapi.ExecResponse, error) {
   163  	const operation = "exec"
   164  	defer recordOperation(operation, time.Now())
   165  
   166  	resp, err := in.service.Exec(ctx, req)
   167  	recordError(operation, err)
   168  	return resp, err
   169  }
   170  
   171  func (in instrumentedRuntimeService) Attach(ctx context.Context, req *runtimeapi.AttachRequest) (*runtimeapi.AttachResponse, error) {
   172  	const operation = "attach"
   173  	defer recordOperation(operation, time.Now())
   174  
   175  	resp, err := in.service.Attach(ctx, req)
   176  	recordError(operation, err)
   177  	return resp, err
   178  }
   179  
   180  func (in instrumentedRuntimeService) RunPodSandbox(ctx context.Context, config *runtimeapi.PodSandboxConfig, runtimeHandler string) (string, error) {
   181  	const operation = "run_podsandbox"
   182  	startTime := time.Now()
   183  	defer recordOperation(operation, startTime)
   184  	defer metrics.RunPodSandboxDuration.WithLabelValues(runtimeHandler).Observe(metrics.SinceInSeconds(startTime))
   185  
   186  	out, err := in.service.RunPodSandbox(ctx, config, runtimeHandler)
   187  	recordError(operation, err)
   188  	if err != nil {
   189  		metrics.RunPodSandboxErrors.WithLabelValues(runtimeHandler).Inc()
   190  	}
   191  	return out, err
   192  }
   193  
   194  func (in instrumentedRuntimeService) StopPodSandbox(ctx context.Context, podSandboxID string) error {
   195  	const operation = "stop_podsandbox"
   196  	defer recordOperation(operation, time.Now())
   197  
   198  	err := in.service.StopPodSandbox(ctx, podSandboxID)
   199  	recordError(operation, err)
   200  	return err
   201  }
   202  
   203  func (in instrumentedRuntimeService) RemovePodSandbox(ctx context.Context, podSandboxID string) error {
   204  	const operation = "remove_podsandbox"
   205  	defer recordOperation(operation, time.Now())
   206  
   207  	err := in.service.RemovePodSandbox(ctx, podSandboxID)
   208  	recordError(operation, err)
   209  	return err
   210  }
   211  
   212  func (in instrumentedRuntimeService) PodSandboxStatus(ctx context.Context, podSandboxID string, verbose bool) (*runtimeapi.PodSandboxStatusResponse, error) {
   213  	const operation = "podsandbox_status"
   214  	defer recordOperation(operation, time.Now())
   215  
   216  	out, err := in.service.PodSandboxStatus(ctx, podSandboxID, verbose)
   217  	recordError(operation, err)
   218  	return out, err
   219  }
   220  
   221  func (in instrumentedRuntimeService) ListPodSandbox(ctx context.Context, filter *runtimeapi.PodSandboxFilter) ([]*runtimeapi.PodSandbox, error) {
   222  	const operation = "list_podsandbox"
   223  	defer recordOperation(operation, time.Now())
   224  
   225  	out, err := in.service.ListPodSandbox(ctx, filter)
   226  	recordError(operation, err)
   227  	return out, err
   228  }
   229  
   230  func (in instrumentedRuntimeService) ContainerStats(ctx context.Context, containerID string) (*runtimeapi.ContainerStats, error) {
   231  	const operation = "container_stats"
   232  	defer recordOperation(operation, time.Now())
   233  
   234  	out, err := in.service.ContainerStats(ctx, containerID)
   235  	recordError(operation, err)
   236  	return out, err
   237  }
   238  
   239  func (in instrumentedRuntimeService) ListContainerStats(ctx context.Context, filter *runtimeapi.ContainerStatsFilter) ([]*runtimeapi.ContainerStats, error) {
   240  	const operation = "list_container_stats"
   241  	defer recordOperation(operation, time.Now())
   242  
   243  	out, err := in.service.ListContainerStats(ctx, filter)
   244  	recordError(operation, err)
   245  	return out, err
   246  }
   247  
   248  func (in instrumentedRuntimeService) PodSandboxStats(ctx context.Context, podSandboxID string) (*runtimeapi.PodSandboxStats, error) {
   249  	const operation = "podsandbox_stats"
   250  	defer recordOperation(operation, time.Now())
   251  
   252  	out, err := in.service.PodSandboxStats(ctx, podSandboxID)
   253  	recordError(operation, err)
   254  	return out, err
   255  }
   256  
   257  func (in instrumentedRuntimeService) ListPodSandboxStats(ctx context.Context, filter *runtimeapi.PodSandboxStatsFilter) ([]*runtimeapi.PodSandboxStats, error) {
   258  	const operation = "list_podsandbox_stats"
   259  	defer recordOperation(operation, time.Now())
   260  
   261  	out, err := in.service.ListPodSandboxStats(ctx, filter)
   262  	recordError(operation, err)
   263  	return out, err
   264  }
   265  
   266  func (in instrumentedRuntimeService) PortForward(ctx context.Context, req *runtimeapi.PortForwardRequest) (*runtimeapi.PortForwardResponse, error) {
   267  	const operation = "port_forward"
   268  	defer recordOperation(operation, time.Now())
   269  
   270  	resp, err := in.service.PortForward(ctx, req)
   271  	recordError(operation, err)
   272  	return resp, err
   273  }
   274  
   275  func (in instrumentedRuntimeService) UpdateRuntimeConfig(ctx context.Context, runtimeConfig *runtimeapi.RuntimeConfig) error {
   276  	const operation = "update_runtime_config"
   277  	defer recordOperation(operation, time.Now())
   278  
   279  	err := in.service.UpdateRuntimeConfig(ctx, runtimeConfig)
   280  	recordError(operation, err)
   281  	return err
   282  }
   283  
   284  func (in instrumentedImageManagerService) ListImages(ctx context.Context, filter *runtimeapi.ImageFilter) ([]*runtimeapi.Image, error) {
   285  	const operation = "list_images"
   286  	defer recordOperation(operation, time.Now())
   287  
   288  	out, err := in.service.ListImages(ctx, filter)
   289  	recordError(operation, err)
   290  	return out, err
   291  }
   292  
   293  func (in instrumentedImageManagerService) ImageStatus(ctx context.Context, image *runtimeapi.ImageSpec, verbose bool) (*runtimeapi.ImageStatusResponse, error) {
   294  	const operation = "image_status"
   295  	defer recordOperation(operation, time.Now())
   296  
   297  	out, err := in.service.ImageStatus(ctx, image, verbose)
   298  	recordError(operation, err)
   299  	return out, err
   300  }
   301  
   302  func (in instrumentedImageManagerService) PullImage(ctx context.Context, image *runtimeapi.ImageSpec, auth *runtimeapi.AuthConfig, podSandboxConfig *runtimeapi.PodSandboxConfig) (string, error) {
   303  	const operation = "pull_image"
   304  	defer recordOperation(operation, time.Now())
   305  
   306  	imageRef, err := in.service.PullImage(ctx, image, auth, podSandboxConfig)
   307  	recordError(operation, err)
   308  	return imageRef, err
   309  }
   310  
   311  func (in instrumentedImageManagerService) RemoveImage(ctx context.Context, image *runtimeapi.ImageSpec) error {
   312  	const operation = "remove_image"
   313  	defer recordOperation(operation, time.Now())
   314  
   315  	err := in.service.RemoveImage(ctx, image)
   316  	recordError(operation, err)
   317  	return err
   318  }
   319  
   320  func (in instrumentedImageManagerService) ImageFsInfo(ctx context.Context) (*runtimeapi.ImageFsInfoResponse, error) {
   321  	const operation = "image_fs_info"
   322  	defer recordOperation(operation, time.Now())
   323  
   324  	fsInfo, err := in.service.ImageFsInfo(ctx)
   325  	recordError(operation, err)
   326  	return fsInfo, nil
   327  }
   328  
   329  func (in instrumentedRuntimeService) CheckpointContainer(ctx context.Context, options *runtimeapi.CheckpointContainerRequest) error {
   330  	const operation = "checkpoint_container"
   331  	defer recordOperation(operation, time.Now())
   332  
   333  	err := in.service.CheckpointContainer(ctx, options)
   334  	recordError(operation, err)
   335  	return err
   336  }
   337  
   338  func (in instrumentedRuntimeService) GetContainerEvents(containerEventsCh chan *runtimeapi.ContainerEventResponse) error {
   339  	const operation = "get_container_events"
   340  	defer recordOperation(operation, time.Now())
   341  
   342  	err := in.service.GetContainerEvents(containerEventsCh)
   343  	recordError(operation, err)
   344  	return err
   345  }
   346  
   347  func (in instrumentedRuntimeService) ListMetricDescriptors(ctx context.Context) ([]*runtimeapi.MetricDescriptor, error) {
   348  	const operation = "list_metric_descriptors"
   349  	defer recordOperation(operation, time.Now())
   350  
   351  	out, err := in.service.ListMetricDescriptors(ctx)
   352  	recordError(operation, err)
   353  	return out, err
   354  }
   355  
   356  func (in instrumentedRuntimeService) ListPodSandboxMetrics(ctx context.Context) ([]*runtimeapi.PodSandboxMetrics, error) {
   357  	const operation = "list_podsandbox_metrics"
   358  	defer recordOperation(operation, time.Now())
   359  
   360  	out, err := in.service.ListPodSandboxMetrics(ctx)
   361  	recordError(operation, err)
   362  	return out, err
   363  }
   364  
   365  func (in instrumentedRuntimeService) RuntimeConfig(ctx context.Context) (*runtimeapi.RuntimeConfigResponse, error) {
   366  	const operation = "runtime_config"
   367  	defer recordOperation(operation, time.Now())
   368  
   369  	out, err := in.service.RuntimeConfig(ctx)
   370  	recordError(operation, err)
   371  	return out, err
   372  }
   373  

View as plain text