版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
大数据管理与监控:Prometheus:Prometheus监控微服务架构1大数据管理与监控:Prometheus基础1.1Prometheus的历史与发展Prometheus是一个开源的系统监控和警报工具包,最初由SoundCloud开发,后来成为CNCF(云原生计算基金会)的托管项目。自2012年发布以来,Prometheus因其强大的数据收集能力、灵活的查询语言以及与微服务架构的无缝集成,迅速在云原生社区中获得了广泛的认可和应用。2016年,Prometheus成为CNCF的第二个托管项目,标志着其在监控领域的成熟和重要性。1.2Prometheus的核心概念Prometheus的核心概念包括:1.2.1时间序列数据Prometheus存储的数据是以时间序列形式存在的,每个时间序列由一组键值对标签(labels)和一个时间序列数据(timeseriesdata)组成。这种数据模型非常适合监控,因为它可以轻松地处理大量指标,并且能够高效地查询和聚合数据。1.2.2拉取模型Prometheus使用拉取(pull)模型来收集数据,这意味着Prometheus会主动从目标系统中拉取指标数据,而不是等待目标系统推送数据。这种模型使得Prometheus能够控制数据收集的频率和一致性,从而确保数据的准确性和实时性。1.2.3服务发现Prometheus支持服务发现机制,能够自动检测和监控微服务架构中的服务实例。这包括通过DNS、Consul、Kubernetes等服务发现工具来动态获取监控目标的列表,从而简化了监控配置和维护。1.2.4查询语言PromQLPromQL是Prometheus的查询语言,它提供了一种强大而灵活的方式来查询和聚合时间序列数据。PromQL支持各种数学运算、函数调用和时间窗口操作,使得用户能够根据需要定制复杂的查询表达式。1.3Prometheus的数据模型Prometheus的数据模型基于时间序列,每个时间序列由以下部分组成:指标(Metrics):指标是Prometheus中数据的基本单位,它代表了被监控系统的一个度量,如CPU使用率、内存使用量等。标签(Labels):标签是与指标关联的键值对,用于描述指标的元数据,如主机名、服务名称等。标签使得Prometheus能够存储和查询高度维度化的数据。时间序列(TimeSeries):时间序列是由一系列带有时间戳的数据点组成的序列,每个数据点都与一个特定的指标和标签集相关联。1.3.1示例:Prometheus指标和标签假设我们有一个微服务架构,其中包含多个服务实例,我们想要监控每个服务实例的CPU使用率。在Prometheus中,我们可以定义一个名为service_cpu_usage的指标,并为每个服务实例添加一个标签service_name和instance。#HELPservice_cpu_usageCPUusageoftheservice.
#TYPEservice_cpu_usagegauge
service_cpu_usage{service_name="serviceA",instance="instance1"}0.25
service_cpu_usage{service_name="serviceA",instance="instance2"}0.30
service_cpu_usage{service_name="serviceB",instance="instance1"}0.15在这个例子中,service_cpu_usage是一个gauge类型的指标,表示服务的CPU使用率。每个数据点都带有service_name和instance标签,用于区分不同的服务实例。1.3.2查询示例使用PromQL,我们可以查询所有服务A的CPU使用率:service_cpu_usage{service_name="serviceA"}或者,我们可以计算所有服务实例的平均CPU使用率:avg(service_cpu_usage)Prometheus的数据模型和查询语言为监控微服务架构提供了强大的工具,使得监控和警报配置变得更加灵活和高效。通过合理设计指标和标签,以及熟练掌握PromQL,我们可以实现对微服务架构的全面监控,及时发现和解决问题,确保系统的稳定运行。2Prometheus在微服务架构中的角色2.1微服务架构概述微服务架构是一种设计模式,它将单个应用程序开发为一组小型、独立的服务,每个服务运行在自己的进程中并使用轻量级通信机制(通常是HTTP资源API)进行通信。这种架构允许每个服务独立部署、扩展和维护,从而提高了系统的可伸缩性和可维护性。然而,微服务架构的复杂性也带来了监控和管理的挑战,因为需要监控的组件数量显著增加,且组件之间的依赖关系更加复杂。2.2Prometheus与微服务的集成Prometheus是一个开源的系统监控和警报工具包,它特别适合于微服务架构的监控。Prometheus通过直接抓取目标系统暴露的指标来收集数据,这使得它能够无缝地与微服务集成,无需额外的代理或中间件。Prometheus的抓取机制基于HTTP,每个微服务只需在自己的端点上暴露指标,Prometheus即可定期抓取这些指标,进行聚合和存储。2.2.1示例:微服务暴露Prometheus指标假设我们有一个微服务,它使用Python的Flask框架构建,并使用Prometheus客户端库来暴露指标。下面是一个简单的示例,展示了如何在微服务中设置Prometheus指标:fromflaskimportFlask
fromprometheus_clientimportCounter,Gauge,start_http_server
app=Flask(__name__)
#定义一个计数器指标,用于记录请求次数
requests_total=Counter('requests_total','Totalnumberofrequests')
#定义一个仪表盘指标,用于显示当前在线用户数
users_online=Gauge('users_online','Numberofuserscurrentlyonline')
@app.route('/')
defhello():
requests_total.inc()#每次请求时,计数器加1
return"Hello,World!"
@app.route('/users')
defusers():
users_online.set(10)#设置当前在线用户数为10
return"Thereare10usersonline."
if__name__=='__main__':
start_http_server(8000)#启动PrometheusHTTP服务器
app.run(host='',port=5000)在这个示例中,我们定义了两个Prometheus指标:一个计数器requests_total用于记录请求总数,一个仪表盘users_online用于显示当前在线用户数。我们使用start_http_server函数启动了一个PrometheusHTTP服务器,它监听在8000端口上,而我们的Flask应用则运行在5000端口上。2.3服务发现与自动监控在微服务架构中,服务实例可能频繁地启动和停止,这使得静态配置监控目标变得不切实际。Prometheus通过服务发现机制解决了这一问题,它能够自动检测网络中可用的服务实例,并将它们添加到监控目标列表中。Prometheus支持多种服务发现机制,包括:Consul:用于发现运行在Consul集群中的服务实例。DNS:通过DNS查询来发现服务实例。Kubernetes:在Kubernetes环境中,Prometheus可以自动发现Pods和Services。Static:虽然不是自动发现,但可以静态配置监控目标。2.3.1示例:使用Kubernetes服务发现在Kubernetes环境中,Prometheus可以通过配置prometheus-kubernetes.yml文件来自动发现并监控运行在集群中的Pods。下面是一个简单的配置示例:global:
scrape_interval:15s
evaluation_interval:15s
scrape_configs:
-job_name:'kubernetes-nodes'
kubernetes_sd_configs:
-role:node
-job_name:'kubernetes-pods'
kubernetes_sd_configs:
-role:pod
relabel_configs:
-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action:keep
regex:true
-source_labels:[__meta_kubernetes_pod_annotation_prometheus_io_port]
action:replace
target_label:__port__
-source_labels:[__address__,__meta_kubernetes_pod_annotation_prometheus_io_port]
action:replace
regex:([^:]+)(?::\d+)?;(\d+)
replacement:$1:$2
target_label:__address__在这个配置文件中,我们定义了两个抓取任务:一个用于监控Kubernetes节点,另一个用于监控Pods。通过kubernetes_sd_configs和relabel_configs,Prometheus能够自动发现并抓取所有带有prometheus.io/scrape注释的Pods的指标。通过这种方式,Prometheus能够在微服务架构中实现动态的服务发现和自动监控,极大地简化了监控配置和管理的复杂性。3配置与部署Prometheus3.1Prometheus的配置文件详解Prometheus的配置文件通常以YAML格式存储,位于/etc/prometheus/prometheus.yml。配置文件允许你定义数据收集的规则、告警规则以及数据的存储方式。下面是一个基本的Prometheus配置文件示例:global:
scrape_interval:15s#设置抓取数据的间隔时间
evaluation_interval:15s#设置评估规则的间隔时间
#用于定义抓取目标的规则
scrape_configs:
-job_name:'prometheus'#定义抓取任务的名称
scrape_interval:5s#设置此任务的抓取间隔
static_configs:
-targets:['localhost:9090']#定义抓取的目标,这里是Prometheus自身在这个配置文件中,global部分定义了全局的抓取和评估间隔时间。scrape_configs列表则定义了具体的抓取任务,包括任务名称、抓取间隔以及目标列表。例如,上面的配置会每5秒抓取一次运行在本地的Prometheus服务的指标。3.2Prometheus的部署与启动Prometheus的部署可以通过多种方式实现,包括直接下载二进制文件、使用Docker容器、或通过包管理器如apt或yum安装。下面以Docker部署为例:#下载Prometheus的Docker镜像
dockerpullprom/prometheus
#使用Docker运行Prometheus,指定配置文件路径
dockerrun-d\
--nameprometheus\
-v/path/to/prometheus.yml:/etc/prometheus/prometheus.yml\
-p9090:9090\
prom/prometheus--config.file=/etc/prometheus/prometheus.yml在上面的命令中,我们首先下载了Prometheus的Docker镜像。然后,通过-v参数将本地的配置文件挂载到容器中,-p参数将容器的9090端口映射到主机的相同端口。最后,通过--config.file参数指定了配置文件的路径,启动了Prometheus服务。3.3监控目标的配置为了监控微服务架构中的服务,你需要在Prometheus的配置文件中添加相应的抓取目标。这通常通过scrape_configs列表中的static_configs或service_discovery来实现。下面是一个使用static_configs来监控多个微服务的示例:scrape_configs:
-job_name:'microservices'
scrape_interval:10s
static_configs:
-targets:['service1:8080','service2:8080','service3:8081']在这个配置中,job_name被设置为microservices,表示这是一个监控微服务的抓取任务。scrape_interval设置为10秒,意味着Prometheus将每10秒抓取一次这些服务的指标。static_configs列表中的targets定义了具体的抓取目标,包括服务名称和端口号。3.3.1动态服务发现在动态环境中,如Kubernetes,使用静态目标列表可能不够灵活。Prometheus支持多种服务发现机制,如KubernetesSD、ConsulSD等。下面是一个使用KubernetesSD的配置示例:scrape_configs:
-job_name:'kubernetes-service-endpoints'
kubernetes_sd_configs:
-role:endpoints
relabel_configs:
-source_labels:[__meta_kubernetes_service_label_app]
regex:'my-app'
action:keep在这个配置中,kubernetes_sd_configs定义了Kubernetes服务发现的规则,role:endpoints表示监控Kubernetes中的服务端点。relabel_configs则用于过滤抓取目标,这里只保留了带有app=my-app标签的服务。通过上述配置和部署步骤,你可以有效地使用Prometheus来监控微服务架构中的服务,收集关键的性能指标,为后续的数据分析和故障排查提供基础。4Prometheus监控微服务实践4.1编写有效的监控指标在微服务架构中,编写有效的监控指标是确保系统稳定性和性能的关键。Prometheus通过定义metrics来收集和存储这些指标,这些指标可以是计数器、直方图、摘要或gauge类型。4.1.1计数器(Counter)计数器用于追踪事件的次数,例如请求次数或错误次数。一旦增加,计数器的值不会减少。#示例代码:定义一个计数器
fromprometheus_clientimportCounter
#定义一个计数器,用于追踪HTTP请求次数
http_requests_total=Counter('http_requests_total','TotalnumberofHTTPrequests',['method','endpoint'])
#增加计数器的值
http_requests_total.labels(method='GET',endpoint='/api/v1/users').inc()4.1.2直方图(Histogram)直方图用于追踪事件的分布情况,例如请求的响应时间。它将事件分组到多个桶中,每个桶代表一个时间范围。#示例代码:定义一个直方图
fromprometheus_clientimportHistogram
#定义一个直方图,用于追踪请求响应时间
request_duration_seconds=Histogram('request_duration_seconds','Requestdurationinseconds',buckets=(0.01,0.05,0.1,0.5,1,2,5))
#记录一个事件的响应时间
request_duration_seconds.observe(0.2)4.1.3摘要(Summary)摘要与直方图类似,但更关注平均值和百分位数,而不是分布。#示例代码:定义一个摘要
fromprometheus_clientimportSummary
#定义一个摘要,用于追踪请求响应时间
request_duration_summary=Summary('request_duration_summary','Requestdurationsummaryinseconds')
#记录一个事件的响应时间
@request_duration_summary.time()
defprocess_request(t):
#这里是处理请求的代码
time.sleep(t)4.1.4GaugeGauge用于追踪数值的实时状态,例如内存使用量或温度。#示例代码:定义一个Gauge
fromprometheus_clientimportGauge
#定义一个Gauge,用于追踪当前在线用户数
current_users=Gauge('current_users','Numberofcurrentusers')
#更新Gauge的值
current_users.set(100)4.2使用Prometheus监控微服务实例Prometheus通过HTTP拉取(scraping)的方式从目标服务收集监控数据。为了监控微服务,需要在每个服务中暴露一个HTTP端点,Prometheus可以定期从这个端点获取数据。4.2.1配置Prometheus在Prometheus的prometheus.yml配置文件中,添加目标服务的job和端点。#示例配置:添加微服务实例作为监控目标
global:
scrape_interval:15s
evaluation_interval:15s
scrape_configs:
-job_name:'microservice'
metrics_path:'/metrics'
static_configs:
-targets:['localhost:8000']4.2.2暴露监控端点在微服务中,使用Prometheus客户端库来暴露一个/metrics端点。#示例代码:在Flask应用中暴露/metrics端点
fromprometheus_clientimportstart_http_server
#启动一个HTTP服务器,暴露/metrics端点
start_http_server(8000)4.3监控数据的可视化展示Prometheus本身并不提供可视化工具,但可以与Grafana等工具集成,以图表形式展示监控数据。4.3.1配置Grafana数据源在Grafana中,添加Prometheus作为数据源。进入Grafana的Configuration->DataSources。点击Adddatasource,选择Prometheus。输入Prometheus服务器的URL。4.3.2创建仪表板使用Grafana创建仪表板,展示微服务的监控指标。点击+->Createdashboard。添加一个Graph面板。在Metrics中选择要展示的指标,例如http_requests_total。调整查询和展示选项,如时间范围、图表类型等。通过上述步骤,可以有效地在微服务架构中使用Prometheus进行监控,并通过Grafana进行数据的可视化展示,从而更好地理解和管理系统的健康状况和性能。5Prometheus的告警系统5.1Prometheus告警原理Prometheus的告警系统基于其强大的查询语言PromQL和灵活的规则配置。告警规则定义了Prometheus如何评估时间序列数据,以确定是否触发告警。这些规则可以是即时的(instant),在特定时间点评估数据,也可以是记录的(recording),用于记录查询结果,但不触发告警。5.1.1原理概述告警规则通过PromQL查询来定义,可以设置阈值和持续时间,以确保告警不仅基于瞬时条件,还基于条件持续了一段时间。Prometheus的告警管理器(Alertmanager)负责接收、去重、分组和发送告警。它根据配置的接收器(receivers)将告警发送给不同的告警接收系统,如邮件、Slack、PagerDuty等。5.1.2评估周期Prometheus默认每1分钟评估一次告警规则,但可以通过配置文件调整评估频率。评估周期的选择应基于监控指标的更新频率和业务需求。5.2配置告警规则告警规则配置在Prometheus的配置文件中,通常位于prometheus.yml。规则可以定义在rule_files数组中指定的文件中。5.2.1示例规则配置groups:
-name:example
rules:
#即时告警规则
-alert:HighCPUUsage
expr:node_cpu_usage>0.8
for:5m
labels:
severity:critical
annotations:
summary:"CPUusageiscriticallyhigh"
description:"CPUusageon{{$labels.instance}}isover80%formorethan5minutes."
#记录规则
-record:high_memory_usage
expr:node_memory_usage>解释alert字段定义了告警的名称。expr字段使用PromQL查询来定义告警条件。for字段定义了条件必须持续的时间,才能触发告警。labels字段用于定义告警的标签,如严重性。annotations字段用于定义告警的描述信息,如summary和description。5.3集成告警接收器告警接收器配置在Alertmanager的配置文件中,通常位于alertmanager.yml。接收器定义了告警发送的目标和格式。5.3.1示例接收器配置global:
resolve_timeout:5m
route:
group_by:['alertname','cluster','service']
group_wait:30s
group_interval:5m
repeat_interval:1h
receiver:slack
receivers:
-name:slack
slack_configs:
-send_resolved:true
api_url:'/services/...'
channel:'#alerts'
title:'PrometheusAlert'
text:'{{.CommonAnnotations.description}}'5.3.2解释global字段定义了全局配置,如告警解决超时时间。route字段定义了告警的路由规则,包括分组、间隔和重复间隔。receiver字段指定了告警的接收器名称。slack_configs字段定义了Slack接收器的配置,包括APIURL、频道和消息格式。5.3.3集成步骤配置Alertmanager:在alertmanager.yml中定义接收器和路由规则。配置Prometheus:在prometheus.yml中指定Alertmanager的位置。测试配置:使用alertmanager--config.file=alertmanager.yml--storage.path=data和promtoolcheckconfigalertmanager.yml命令检查配置的有效性。启动服务:确保Prometheus和Alertmanager服务都已启动,并且能够相互通信。通过以上步骤,可以实现Prometheus监控微服务架构中的告警自动化,及时通知运维人员处理异常情况,提高系统的稳定性和响应速度。6Prometheus监控最佳实践6.1监控指标的设计原则在设计Prometheus监控指标时,遵循以下原则可以确保监控系统的有效性和可维护性:明确性:每个指标都应有明确的定义和用途,避免模糊不清的指标名称。粒度适中:指标应设计在适当的粒度上,既不过于细化也不过于粗略,以平衡监控的详细程度和系统性能。命名规范:使用清晰、一致的命名规则,如<业务领域>_<功能模块>_<指标类型>。避免过度监控:只监控对业务有直接影响的指标,避免监控过多不必要的数据点。可聚合性:设计指标时考虑其聚合的可能性,以便于进行趋势分析和问题定位。实时性与历史数据:确保指标能够实时反映系统状态,同时也应考虑历史数据的保存,以供回溯分析。6.1.1示例:设计一个微服务的响应时间指标#HELPservice_response_time_secondsTheresponsetimeoftheserviceinseconds.
#TYPEservice_response_time_secondssummary
service_response_time_seconds{quantile="0.5"}0.0123
service_response_time_seconds{quantile="0.9"}0.0234
service_response_time_seconds{quantile="0.99"}0.0345在这个例子中,service_response_time_seconds是一个监控微服务响应时间的指标,使用summary类型来记录不同分位数的响应时间,这有助于分析服务的响应时间分布。6.2监控系统的可扩展性Prometheus监控系统的可扩展性主要体现在以下几个方面:横向扩展:Prometheus可以通过增加更多的Prometheus服务器实例来处理更多的监控数据,实现负载均衡。动态发现:Prometheus支持动态服务发现,可以自动发现并监控新加入的微服务实例。告警规则的动态加载:Prometheus支持动态加载和更新告警规则,无需重启服务即可生效。存储层的可扩展性:Prometheus的存储层可以扩展到外部的时序数据库,如Cortex或Thanos,以支持大规模监控数据的存储和查询。6.2.1示例:使用Prometheus的动态服务发现在Prometheus的配置文件中,可以使用service_discovery模块来动态发现微服务实例:scrape_configs:
-job_name:'microservices'
consul_sd_configs:
-server:'http://consul:8500'
services:
-name:'service-a'
-name:'service-b'在这个例子中,Prometheus会从Consul服务发现中自动获取service-a和service-b的实例信息,并对其进行监控。6.3故障排查与性能优化Prometheus提供了丰富的工具和功能,帮助进行故障排查和性能优化:PromQL查询语言:PromQL是一种强大的查询语言,可以用来查询和聚合监控数据,帮助快速定位问题。告警管理:Prometheus的告警系统可以设置复杂的告警规则,当监控指标达到预设阈值时,自动触发告警。监控面板:通过Grafana等工具,可以创建可视化监控面板,直观展示监控数据,便于监控和分析。性能优化:Prometheus的性能优化主要集中在减少不必要的监控数据收集,优化PromQL查询,以及合理配置存储策略。6.3.1示例:使用PromQL进行故障排查假设我们有一个微服务集群,需要监控所有服务的请求失败率。可以使用以下PromQL查询:#查询所有服务的请求失败率
sum(rate(requests_total{status="500"}[5m]))by(job)这个查询会计算过去5分钟内所有服务(job标签)的500状态码请求的平均速率,帮助我们快速识别哪些服务可能存在问题。以上内容详细介绍了Prometheus监控微服务架构时的最佳实践,包括监控指标的设计原则、监控系统的可扩展性,以及故障排查与性能优化的方法和示例。遵循这些原则和实践,可以构建一个高效、稳定、易于维护的监控系统。7高级Prometheus监控技术7.1Prometheus的远程写入功能7.1.1原理Prometheus的远程写入功能允许将时间序列数据发送到Prometheus服务器之外的其他系统,如长期存储解决方案或数据聚合平台。这通过HTTPPOST请求实现,数据以Prometheus的文本格式或其二进制格式写入。远程写入对于需要将监控数据整合到现有数据平台或进行更复杂的数据分析和存储的场景特别有用。7.1.2内容要启用远程写入,需要在Prometheus的配置文件中设置remote_write配置。以下是一个配置示例:global:
scrape_interval:15s
evaluation_interval:15s
remote_write:
-url:"http://remote-write-endpoint:9095/metrics"
queue_config:
capacity:5000
max_shards:1000
min_shards:1
max_samples_per_send:1000
batch_send_deadline:5s在这个例子中,Prometheus将数据发送到http://remote-write-endpoint:9095/metrics。queue_config用于配置数据发送队列的参数,如队列容量、最大和最小分片数、每次发送的最大样本数以及批处理发送的截止时间。7.1.3示例假设我们有一个Prometheus实例,需要将数据远程写入到另一个Prometheus服务器。首先,确保接收端Prometheus服务器配置了remote_read和remote_write端点。然后,在发送端Prometheus的配置文件中添加以下配置:remote_write:
-url:"http://receiver-prometheus:9091/api/v1/write"这将使发送端Prometheus将数据发送到receiver-prometheus的9091端口。7.2Prometheus与Kubernetes的深度集成7.2.1原理Prometheus与Kubernetes的深度集成通过使用PrometheusOperator和自定义资源定义(CRDs)实现。PrometheusOperator是一个Kubernetes控制器,它读取PrometheusCRDs并创建、更新或删除Prometheus实例、服务监控、警报管理器等资源。这使得在Kubernetes环境中部署和管理Prometheus监控变得非常简单和自动化。7.2.2内容在Kubernetes中部署Prometheus,首先需要安装PrometheusOperator。这通常通过Helmchart或直接使用OperatorSDK完成。安装后,可以创建PrometheusCRD来定义Prome
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 有关幼儿园的小班月工作计划总结计划
- 2024年物流合作保险法律保障详尽协议版B版
- 买卖合同锦集六篇
- 2024年营养强化剂项目深度研究分析报告
- 服装销售店长工作计划
- 九年级计划作文600字
- 家长会发言稿集锦15篇
- 管理类实习经验报告毕业生
- 一周工作计划模板
- 年产12000吨十二烷基苯磺酸钠(浓缩洗衣粉)提升改造项目环评报告表
- 2024年全国《国防和兵役》理论知识竞赛试题库与答案
- 企业知识产权保护策略及实施方法研究报告
- 2024年07月11026经济学(本)期末试题答案
- 2024年中小企业股权融资合同3篇
- 2024年01月11289中国当代文学专题期末试题答案
- 2024年秋季生物教研组工作计划
- 2024年云南高中学业水平合格考历史试卷真题(含答案详解)
- 2025年董事长年会发言稿范文
- 医院廉洁购销合同
- 车间设备线路安装方案
- 检验科各专业组上岗轮岗培训考核制度全6页
评论
0/150
提交评论