K8S结合Prometheus构建监控系统

一、Prometheus简介

Prometheus 是一个开源的系统监控和警报工具,用于收集、存储和查询时间序列数据。它专注于监控应用程序和基础设施的性能和状态,并提供丰富的查询语言和灵活的告警机制

1、Prometheus基本介绍

  1. 数据模型:Prometheus 使用时间序列数据模型来存储监控数据。时间序列由一个唯一的指标名称和一组键值对标签组成,代表了某个指标在特定时间点的数值。这种数据模型非常适合度量指标的变化和趋势。
  2. 数据采集:Prometheus 支持多种数据采集方式。它可以直接采集应用程序的指标数据,也可以通过各种监控插件和集成来获取系统和网络层面的指标数据。采集的数据通过 HTTP 或其他协议发送给 Prometheus 服务器进行存储和处理。
  3. 存储和查询:Prometheus 使用本地存储方式,将采集的时间序列数据保存在本地磁盘上。它提供了灵活而高效的查询语言(PromQL),可以对存储的数据进行实时查询和聚合操作,以便生成有关监控指标的图表、报表和警报。
  4. 告警和警报规则:Prometheus 具有强大的告警功能,可以根据指标的阈值、表达式和持续时间等条件设置警报规则。当条件满足时,它可以触发警报并发送通知,如发送电子邮件、短信或通过集成的通知服务进行报警。
  5. 可视化和集成:虽然 Prometheus 本身提供了基本的查询和图表功能,但它也可以与其他工具和服务集成,如 Grafana,用于更丰富的数据可视化和仪表板展示。

2.Prometheus特点

  1. 多维度数据模型:Prometheus 采用了多维度的时间序列数据模型,每个时间序列都由指标名称和一组标签键值对组成。这种数据模型使得用户可以灵活地对监控数据进行多维度的查询和聚合,以获取更准确和细粒度的监控指标。
  2. 高效的数据采集:Prometheus 支持多种灵活的数据采集方式。它可以通过客户端库(例如Prometheus 客户端库)直接采集应用程序的指标数据,也可以通过各种监控插件和集成方式获取系统、网络和第三方服务的指标数据。数据采集的过程高效而可靠,可以适应各种规模和复杂度的监控场景。
  3. 强大的查询语言:Prometheus 提供了强大而灵活的查询语言(PromQL),用于对存储的监控数据进行实时查询和聚合操作。PromQL 支持范围查询、聚合函数、算术运算和向量操作等,使得用户能够方便地分析和提取所需的监控指标。
  4. 动态监控和自动发现:Prometheus 支持动态监控和自动发现机制。它可以自动探测和监控新加入集群的目标,例如新部署的应用实例或新增的节点。通过定义合适的自动发现规则,Prometheus 能够及时识别和监控新的目标,实现动态的监控配置和管理。
  5. 灵活的告警机制:Prometheus 具备强大的告警功能,用户可以定义灵活的警报规则,并根据阈值、表达式和持续时间等条件触发警报。它能够及时发送通知,如电子邮件、短信或调用API,以便运维人员能够快速响应和解决潜在的问题。
  6. 生态系统和集成:Prometheus 拥有丰富的生态系统和广泛的集成能力。它可以与其他工具和服务集成,如 Grafana 用于可视化、Alertmanager 用于告警通知、Exporter 用于采集非Prometheus 格式的指标数据等。这种集成能力使得用户能够构建全面和强大的监控解决方案。

3.Prometheus生态包含组件

  1. Prometheus Server:Prometheus 服务器是核心组件,用于收集、存储和处理时间序列数据。它负责从各个目标主机上抓取监控指标数据,并将其存储在本地磁盘中供后续查询和分析使用。
  2. Exporters:Exporter 是用于从各种系统、服务和应用程序中抓取指标数据的组件。Prometheus 提供了一些官方的 Exporter,同时也支持社区开发的 Exporter。Exporter 将特定系统的指标数据暴露出来,使其可以被 Prometheus Server 收集。
  3. Alertmanager:Alertmanager 是负责处理和发送警报通知的组件。当 Prometheus Server检测到警报条件时,它将警报发送给 Alertmanager,然后 Alertmanager 负责对警报进行处理、去重、分组和路由,并将警报通知发送给配置的接收方(如电子邮件、Slack、PagerDuty等)。
  4. Grafana:Grafana 是一个流行的可视化仪表板工具,用于创建漂亮的监控仪表板。通过与Prometheus 集成,Grafana 可以从 Prometheus Server 中查询和展示监控指标数据,并以图表和图形的形式展示给用户。
  5. Pushgateway:Pushgateway 是一个中间组件,允许短期作业(如批处理任务)将其指标数据推送到 Prometheus Server。短期作业通常无法被长期监控,因此 Pushgateway 提供了一个临时存储的机制,以便 Prometheus Server 可以主动从 Pushgateway 拉取指标数据。

二、安装Prometheus
1.安装采集节点资源指标组件 node-exporter

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  namespace: monitor-sa
  labels:
    name: node-exporter
spec:
  selector:
    matchLabels:
      name: node-exporter
  template: 
    metadata:
      labels:
        name: node-exporter
    spec:
      hostIPC: true
      hostNetwork: true
      hostPID: true
      containers:
      - name: node-exporter
        image: docker.io/prom/node-exporter:v0.16.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9100
        resources:
          requests:
            cpu: 0.15
        securityContext:
          privileged: true
        args:
        - --path.procfs
        - /host/proc  #指定 proc 文件系统的路径为/host/proc。Node Exporter 使用proc 文件系统来获取有关进程和系统信息的指标数据。
        - --path.sysfs
        - /host/sys    #指定 sys 文件系统的路径为/host/sys。Node Exporter 使用 sys 文件系统来获取有关系统硬件资源和内核信息的指标数据。
        - --collector.filesystem.ignored-mount-points
        - '"^/(sys|proc|dev|host|etc)($|/)"'  #配置要忽略的文件系统挂载点的正则表达式。这个正则表达式指定了一些常见的文件系统挂载点,如/sys、/proc、/dev、/host 和/etc。Node Exporter 将忽略这些挂载点上的文件系统,不采集与其相关的指标数据
        volumeMounts:
        - name: dev
          mountPath: /host/dev
        - name: proc
          mountPath: /host/proc
        - name: sys
          mountPath: /host/sys
        - name: rootfs
          mountPath: /rootfs
      tolerations:
      - key: "node-role.kubernetes.io/control-plane"
        operator: "Exists"
        effect: "NoSchedule"
      volumes:
      - name: proc
        hostPath:
          path: /proc
      - name: dev
        hostPath:
          path: /dev
      - name: sys
        hostPath:
          path: /sys
      - name: rootfs
        hostPath:
          path: /

2.配置Prometheus server服务的configmap

#创建一个namespace
kubectl create ns monitor-sa
#创建一个sa账号
kubectl create serviceaccount monitor -n monitor-sa
#把sa账号monitor通过clusterrolebing绑定到clusterrole
kubectl create clusterrolebinding monitor-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=monitor-sa:monitor
创建数据目录
mkdir /data
chmod 777 /data
#配置prometheus的configmap
参考地址:
github:https://github.com/prometheus/prometheus/blob/release-2.31/documentation/examples/prometheus-kubernetes.yml
官网:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config
vim prometheus-cfg.yaml
---
kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    app: test-prometheus
  name: prometheus-config
  namespace: monitor-sa
data:
  prometheus.yml: |
    global:
      scrape_interval: 15s
      scrape_timeout: 10s
      evaluation_interval: 1m
    scrape_configs:
    - job_name: 'kubernetes-node'
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'
        target_label: __address__
        action: replace
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
    - job_name: 'kubernetes-node-cadvisor'
      kubernetes_sd_configs:
      - role:  node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
    - job_name: 'kubernetes-apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
      - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https
    - job_name: 'kubernetes-service-endpoints'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
        action: replace
        target_label: __scheme__
        regex: (https?)
      - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
        action: replace
        target_label: __address__
        regex: ([^:]+)(?::\d+)?;(\d+)
        replacement: $1:$2
      - action: labelmap
        regex: __meta_kubernetes_service_label_(.+)
      - source_labels: [__meta_kubernetes_namespace]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [__meta_kubernetes_service_name]
        action: replace
        target_label: kubernetes_name 

3.通过deployment部署Prometheus

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-prometheus
  labels:
    app: test-prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-prometheus
  template:
    metadata:
      labels:
        app: test-prometheus
      annotations:
        prometheus.io/scrape: 'true'
    spec:
      securityContext:
        runAsUser: 0
      containers:
        - name: test-prometheus
          image: docker.io/prom/prometheus:v2.33.5
          imagePullPolicy: Always
          command:
            - prometheus
            - --config.file=/etc/prometheus/prometheus.yml
            - --storage.tsdb.path=/prometheus        #数据存储目录
            - --storage.tsdb.retention=168h          #数据保存时长
            - --web.enable-lifecycle                 #开启热加载
          ports:
            - containerPort: 9090
              protocol: TCP
          volumeMounts:
            - mountPath: /etc/prometheus/prometheus.yml
              name: prometheus-config
              subPath: prometheus.yml
            - mountPath: /prometheus/
              name: prometheus-storage-volume
          resources:
            requests:
              memory: 1Gi
              cpu: "1"
            limits:
              memory: 2Gi
              cpu: "1"
      volumes:
        - name: prometheus-config
          configMap:
            name: prometheus-config
            items:
              - key: prometheus.yml
                path: prometheus.yml
                mode: 0644
        - name: prometheus-storage-volume
          hostPath:
            path: /var/lib/docker/data/{{ $.Chart.Name }}/data
            type: DirectoryOrCreate

4.给Prometheus pod创建一个service

---
apiVersion: v1
kind: Service
metadata:
  name: prometheussvc
  labels:
    app: test-prometheus
  namespace: monitor-sa
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      protocol: TCP
  selector:
    app: test-prometheus

#查看映射端口
[root@master1 prometheus]# kubectl describe svc test-prometheus -n monitor-sa
Name:                     test-prometheus
Namespace:                monitor-sa
Labels:                   app=test-prometheus
                          app.kubernetes.io/managed-by=Helm
Annotations:              meta.helm.sh/release-name: prometheus
                          meta.helm.sh/release-namespace: monitor-sa
                          name: test-prometheus
                          prometheus.io/scrape: true
Selector:                 app=test-prometheus
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.96.128.98
IPs:                      10.96.128.98
Port:                     http  9090/TCP
TargetPort:               9090/TCP
NodePort:                 http  31439/TCP
Endpoints:                10.244.247.6:9090
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

#页面访问测试

http://192.168.100.17:31439/graph

5.安装配置可视化UI界面graphna

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-grafana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-grafana
  template:
    metadata:
      labels:
        app: test-grafana
    spec:
      containers:
        - name: test-grafana
          image: docker.io/grafana/grafana:8.4.5
          imagePullPolicy: Always
          ports:
            - containerPort: 3000
              protocol: TCP
          volumeMounts:
            - mountPath: /etc/ssl/certs
              name: ca-certificates
              readOnly: true
            - mountPath: /var/lib/grafana
              name: grafana-storage
          resources:
            requests:
              memory: 1Gi
              cpu: "1"
            limits:
              memory: 1Gi
              cpu: "1"
          env:
            - name: INFLUXDB_HOST
              value: monitoring-influxdb
            - name: GF_SERVER_HTTP_PORT
              value: "3000"
            - name: GF_AUTH_BASIC_ENABLED
              value: "false"
            - name: GF_AUTH_ANONYMOUS_ENABLED
              value: "true"
            - name: GF_AUTH_ANONYMOUS_ORG_ROLE
              value: Admin
            - name: GF_SERVER_ROOT_URL
              value: /
      volumes:
        - name: ca-certificates
          hostPath:
            path: /etc/ssl/certs
        - name: grafana-storage
          emptyDir:
            medium: Memory
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: test-grafana
  name: test-grafana
spec:
  ports:
    - name: http
      port: 3000
      targetPort: 3000
      protocol: TCP
  selector:
    app: test-grafana
  type: NodePort
#查看转发端口
 kubectl get svc -n monitor-sa
NAME              TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
test-grafana      NodePort   10.100.121.25   <none>        3000:31562/TCP   4m4s


三、页面展示

#访问:
http://192.168.100.16:31562/

在这里插入图片描述
6.配置grafana界面
选择 Add your first data source
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
附:面板导入下载:https://grafana.com/grafana/dashboards/

五、安装kube-state-metrics 组件

kube-state-metrics 是一个开源的 Kubernetes 监控工具,它通过将 Kubernetes 集群中的资源状态转换为可观察的指标(metrics),提供了对 Kubernetes 对象的详细监控和可视化。以下是 kube-state-metrics 的基本介绍:

  1. 功能:kube-state-metrics 从 Kubernetes API 服务器中获取资源对象的当前状态,并将其转换为 Prometheus 指标。它监视集群中的各种资源,包括节点、命名空间、部署、服务、副本集、状态集、持久卷等。通过 kube-state-metrics,您可以获取有关这些资源的重要指标,例如资源的数量、创建时间、标签、状态等。
  2. 架构:kube-state-metrics 作为一个独立的容器化应用程序运行在 Kubernetes 集群中,它定期轮询 Kubernetes API 服务器以获取资源对象的信息。然后,它将这些信息转换为可观察的指标,并将其公开为 Prometheus 兼容的 HTTP 端点。
  3. Prometheus 兼容性:kube-state-metrics 以 Prometheus 的数据模型为基础,生成符合Prometheus 指标格式的指标数据。这使得 Prometheus 能够通过 HTTP 抓取 kube-statemetrics 的指标数据,并将其用于监控和警报。
  4. 指标示例:kube-state-metrics 生成的指标包括对象的数量、重启次数、资源限制、标签信息、容器状态等。例如,您可以获取每个命名空间的 Pod 数量、每个节点的 CPU 和内存使用情况、每个服务的副本数量等信息。
  5. 可视化和监控:通过将 kube-state-metrics 与 Prometheus 和 Grafana 等工具结合使用,您可以创建仪表板和报警规则,对 Kubernetes 集群中的资源进行实时监控和可视化。这使您能够了解集群中资源的状态、趋势和性能,以便进行故障排查、容量规划和性能优化。

安装与配置kube-state-metrics
创建SA并对SA授权


---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: kube-state-metrics
  namespace: monitor-sa
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: kube-state-metrics
rules:
- apiGroups: [""]
  resources: ["nodes", "pods", "services", "resourcequotas", "replicationcontrollers", "limitranges", "persistentvolumeclaims", "persistentvolumes", "namespaces", "endpoints"]
  verbs: ["list", "watch"]
- apiGroups: ["extensions"]
  resources: ["daemonsets", "deployments", "replicasets"]
  verbs: ["list", "watch"]
- apiGroups: ["apps"]
  resources: ["statefulsets"]
  verbs: ["list", "watch"]
- apiGroups: ["batch"]
  resources: ["cronjobs", "jobs"]
  verbs: ["list", "watch"]
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kube-state-metrics
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kube-state-metrics
subjects:
- kind: ServiceAccount
  name: kube-state-metrics
  namespace: monitor-sa

创建deployment/service


apiVersion: apps/v1
kind: Deployment
metadata:
  name: kube-state-metrics
  namespace: monitor-sa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kube-state-metrics
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: kube-state-metrics
      containers:
      - name: kube-state-metrics
        image: quay.io/coreos/kube-state-metrics:v1.9.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: 'true'
  name: kube-state-metrics
  namespace: monitor-sa
  labels:
    app: kube-state-metrics
spec:
  ports:
  - name: kube-state-metrics
    port: 8080
    protocol: TCP
  selector:
    app: kube-state-metrics

在granfana的web界面中导入Kubernetes cluster monitoring (via Prometheus) (k8s 1.16)-1577691996738.json即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/276238.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

H5向微信小程序发送信息(小程序web-view打开H5)

引入weixin-js-sdk npm i weixin-js-sdk 页面引入 // 引入wxjsimport wx from "weixin-js-sdk"; 点击触发方法 methods: {goweap(id){console.log(wx);// H5传递数据 &#xff08;navigateBack&#xff09;wx.miniProgram.navigateBack({delta: 1});wx.min…

如何购买腾讯云的服务器(详解腾讯云服务器购买流程)

腾讯云服务器购买流程直接在官方秒杀活动上购买比较划算&#xff0c;在云服务器CVM或轻量应用服务器页面自定义购买价格比较贵&#xff0c;但是自定义购买云服务器CPU内存带宽配置选择范围广&#xff0c;活动上购买只能选择固定的活动机&#xff0c;选择范围窄&#xff0c;但是…

Smartbi获工信部旗下赛迪网“2023行业信息技术应用创新产品”奖

近日&#xff0c;由工信部旗下的赛迪网、《数字经济》杂志共同主办的2023行业信息技术应用创新大会上&#xff0c;“信息技术应用创新成果名单”重磅揭晓&#xff0c;思迈特软件凭借“Smartbi 自然语言分析引擎”斩获“2023行业信息技术应用创新产品”大奖。 据了解&#xff0c…

图分割算法之贪心算法

1 贪心算法的思想 Linear Deterministic Greedy partitioning (LDG)考虑在分割的时候将邻居结点放置在一起&#xff0c;以减少切割边。它采用贪心算法将一个结点放置在包含其邻居最多的子图中&#xff0c;同时保证每个子图的结点负载均衡&#xff0c;整个算法流程图如下其中 C …

基于人工势场法的航线规划

MATLAB2016b可以运行 基于人工势场法的航线规划资源-CSDN文库

C# OpenCvSharp读取rtsp流录制mp4可分段保存

软件界面&#xff1a; 测试环境&#xff1a; VS2019 .NET Framework 4.7.2 OpencvSharp4.8.0 输入RTSP流地址即可拉取RTSP流&#xff0c;支持抓拍和录制RTSP流视频&#xff0c;且支持支持按固定时间保存&#xff0c;比如我想5分钟保存一个视频&#xff0c;设置保存间隔为30…

边缘检测——PidiNet网络训练自己数据集并优化推理测试(详细图文教程)

PiDiNet 是一种用于边缘检测的算法&#xff0c;它提出了一种简单、轻量级但有效的架构。PiDiNet 采用了新 颖的像素差卷积&#xff0c;将传统的边缘检测算子集成到现代 CNN 中流行的卷积运算中&#xff0c;以增强任务性能。 在 BSDS500、NYUD 和 Multicue 上进行了大量的实验…

联营商自述被坑惨,加盟库迪没有未来?

撰稿 | 多客 来源 | 贝多财经 近日&#xff0c;库迪联营商在社交平台不约而同发出了致库迪咖啡管理层的公开信&#xff0c;两封公开信可谓字字珠玑&#xff0c;没有一句废话&#xff0c;揭开了库迪咖啡在细节、运营、扩张、培训等方方面面的“背后真相”。 两封公开信 折射库…

大数据技术16:数据湖和湖仓一体

前言&#xff1a;近几年大数据概念很多&#xff0c;数据库和数据仓库还没搞清楚&#xff0c;就又出了数据湖&#xff0c;现在又开始流行湖仓一体。互联网公司拼命造高大上概念来忽略小白买单的能力还是可以的。 1、数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以…

24、Qt使用QCustomPlot

一、下载文件 进入官网&#xff0c;选择“Download”、QCustomPlot.tar.gz Qt Plotting Widget QCustomPlot - Download 二、创建项目 创建一个"Qt Widget Application"项目&#xff0c;基类选择“QMainWindow”&#xff0c;把刚才下载的压缩包里的“qcustomplot.…

给零基础朋友的编程课08 - 代码

给零基础朋友的编程课08 - 旋转、圆弧、初识模块化编程。_哔哩哔哩_bilibili Code: / // 彩色案例 艺术仿制品3 // /// 色表 // // 奶白 215,214,160 // 金黄 187,176,112 // 赭石 96,56,20 // 橙色 218,114,53// 项目设定 size(1000,1000); background(215,214,160); stroke…

vue3-13

token可以是后端api的访问依据&#xff0c;一般绝大多数时候&#xff0c;前端要访问后端的api,后端都要求前端请求需要携带一个有效的token,这个token用于用户的身份校验&#xff0c;通过了校验&#xff0c;后端才会向前端返回数据&#xff0c;进行相应的操作&#xff0c;如果没…

c++ / day01

1. 整理思维导图 2. 定义自己的命名空间myspace&#xff0c;并在myspace中定义一个字符串&#xff0c;实现求字符串大小的函数。 代码 #include <iostream>using namespace std;namespace myns {unsigned long long strlen(string s){return s.length();}}int main() {…

算法导论复习(七) 动态规划

动态规划一般用来求解最优化问题 设计一个动态规划算法一般有以下四步&#xff1a; 描述一个最优解的结构特征。递归地定义最优解的值。计算最优解的值&#xff0c;通常采用自底向上的方法。利用计算出的信息构造出一个最优解。 钢条切割问题 体现了动态规划的一个重要性质&a…

获取b站合集视频时长最新可用代码(2023.12.28)小白也能用

在网上搜索获取b站分集视频时长的代码&#xff0c;发现大部分都过时了 原链接&#xff1a;已过时代码链接 我对原代码做出了部分修改&#xff0c;以下代码于2023.12.28测试&#xff08;Edge浏览器&#xff09; javascript: (function() {var hour 0;var minute 0;var secon…

Leetcode—1572.矩阵对角线元素的和【简单】

2023每日刷题&#xff08;七十三&#xff09; Leetcode—1572.矩阵对角线元素的和 实现代码 class Solution { public:int diagonalSum(vector<vector<int>>& mat) {int n mat.size();if(n 1) {return mat[0][0];}int sum 0;int i 0, j n - 1;while(i &…

低信噪比环境下的语音端点检测

端点检测技术 是 语音信号处理 的关键技术之一为提高低信噪比环境下端点检测的准确率和稳健性&#xff0c;提出了一种非平稳噪声抑制和调制域谱减结合功率 归一化 倒谱距离的端点检测算法 1 端点检测 1-1 定义 定义&#xff1a;在 存在背景噪声 的情况下检测出 语音的起始点和…

Android中_Service生命周期和AMS流程的创建

Service生命周期可以结合Android生命周期分析。 Service生命周期可以从两种启动Service的模式开始讲起&#xff0c;分别是context.startService()和context.bindService()。 Service的生命周期与启动和绑定状态相关。当调用startService()方法启动服务时&#xff0c;会执行onS…

“踩坑”经验分享:Swift语言落地实践

作者 | 路涛、艳红 导读 Swift 是一种适用于iOS/macOS应用开发、服务器端的编程语言。自2014年苹果发布 Swift 语言以来&#xff0c;Swift5 实现了 ABI 稳定性、Module 稳定性和Library Evolution&#xff0c;与Objective-C&#xff08;下文简称“OC”&#xff09;相比&#xf…

QLabelQPushButton和QLineEdit

QLabel 设置文件格式字体颜色背景 源码 设置图片 源码 设置gif 设置文本 源码 富文本 (Rich Text): 格式化选项&#xff1a;富文本支持各种格式化选项&#xff0c;如字体样式&#xff08;粗体、斜体&#xff09;、字体大小、颜色、超链接、图片插入、列表、表格等。文件格式&a…