zabbix LLD 自定义脚本

一 前言

二 懒人必备zabbix监控之 LLD (low level discovery)

本次的教程是我想监控kafka的消费情况,举个栗子

[root@VM_0_98_centos bin]# ./kafka-consumer-groups.sh --bootstrap-server 172.20.150.1:9092 --describe --group ee

TOPIC           PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                               HOST            CLIENT-ID
ee_172_20_50    0          93864           93864           0               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_25    0          592471          592480          9               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_19    0          156781          156781          0               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_26    0          1345            1345            0               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_22    0          197724          197747          23              ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_23    0          147067          147067          0               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_24    0          620405          620406          1               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_172_20_21    0          7883826         7883828         2               ee-0-213a104f-f2b7-490d-80cd-a4e391f292ab /172.20.150.1   ee-0
ee_scm          0          205365          205365          0               -                                         -               -

说明: 红色部分表示表示消费的个数,黄色部分为生产的个数,绿色部分为剩余多少个

  

这个够直接了吧,先说一下为啥使用LLD 呢,这个先不解释。看完你应该会明白吧,如果不明白,就跟着耍一遍,应该就明白了

 

1 zabbix_agent 端配置
[root@VM_0_98_centos ~]# cat /opt/zabbix_agent/conf/zabbix_agentd.conf
PidFile=/opt/zabbix_agent/pids/zabbix_agentd.pid
LogFile=/opt/zabbix_agent/logs/zabbix_agentd.log
LogFileSize=0
AllowRoot=1
# StartAgents=0
Server=zabbix-server_IP
ServerActive=zabbix-server_IP
Hostname=VM_0_98_centos_zabbix-agent_IP
Include=/opt/zabbix_agent/conf/zabbix_agentd/*.conf
UnsafeUserParameters=1
HostMetadataItem=system.uname
HostMetadata=ee_mq
Timeout=30

  

在总的配置文件中定义导入其他配置文件,这里说一下为啥需要分配置文件,因为我觉得清爽,没啥理由。如果硬要给一个理由就是,我喜欢这样,好吧,我承认这样非常方便管理

[root@VM_0_98_centos zabbix_agentd]# ll
total 20
-rwxr-xr-x 1 zabbix zabbix  173 Mar 12 11:11 java_process.conf
-rw-r--r-- 1 root   root    180 Mar 15 11:47 kafka.conf
-rwxr-xr-x 1 zabbix zabbix   75 Mar  8 17:11 tcp_conn_status.conf

看到没,我分配了很多配置文件,每个文件对应前端一个模板,脚本中的一个或者几个脚本。这样管理起来非常的方便。如果不分开,后期维护的人会非常恨你。曾经听说一个程序员因不满其他四个同事的做事风格把他们四个枪毙了,你看着办吧

 

[root@VM_0_98_centos zabbix_agentd]# cat kafka.conf 
UserParameter=kafka.discovery,sudo python /opt/zabbix_agent/scripts/kafka/get_kafka.py
UserParameter=kafka.data[*],sudo python /opt/zabbix_agent/scripts/kafka/get_data.py $1 $2 $3

  

脚本一共三个文件

[root@VM_0_98_centos kafka]# ll
total 12
-rwxr-xr-x 1 root   root   2526 Mar 15 11:42 get_data.py
-rwxr-xr-x 1 zabbix zabbix 2279 Mar 15 11:32 get_kafka.py
-rw-r--r-- 1 zabbix zabbix   18 Mar 14 16:47 kafka_monitor.yaml

  

1)先来看看配置文件中是啥kafka_monitor.yaml

[root@VM_0_98_centos kafka]# cat kafka_monitor.yaml 
groups:
  ee
  ng

  

没错,就是你logstash中自己定义的group

2)先看get_kafka.py 中是干啥的呢?

#!/usr/bin/env python
# coding:utf-8

import yaml
import os
import sys
import subprocess
import re
import time
import json

# ./kafka-consumer-groups.sh --bootstrap-server 172.20.150.1:9092 --describe --group ee

class KafkaMonitor(object):
    def __init__(self):
        self.bootstrap_server = "172.20.150.1:9092"
        self.cmd = "/opt/kafka/kafka_2.12-2.1.0/bin/kafka-consumer-groups.sh"

        try:
            f = file(os.path.dirname(os.path.abspath(__file__)) + '/' + 'kafka_monitor.yaml')
            self.groups = yaml.load(f)
        except IOError as e:
            print 'Error, kafka_monitor.yaml is not found'
            sys.exit(1)
        else:
            f.close()
            if self.groups is None:
                self.groups = {}
                print 'Error, kafka_monitor.yaml content is empty'
                sys.exit(2)


    def run(self):
        self.result_list = []
        for self.group in self.groups.values()[0].split():
            self.cmd_run = "%s --bootstrap-server %s --describe --group %s | egrep -v 'TOPIC|^$'" % (
            self.cmd, self.bootstrap_server, self.group)
            subp = subprocess.Popen(self.cmd_run, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            self.datas_list = subp.stdout.readlines()
            self.result_dict = {}
            for data_list in self.datas_list:
                data_list = data_list.strip().split()
                # self.result_data = {'datetime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 'topic': data_list[0],
                #                     'group': self.arg1, 'partition': int(data_list[1]), 'logsize': data_list[2],
                #                     'offset': int(data_list[3]), 'lag': data_list[4]}
                # self.result_data = {"{#GROUPNAME}": self.arg1,"{#TOPICNAME}": data_list[0],
                #                     "{#LOGSIZE}": int(data_list[2]),"{#OFFSET}":int(data_list[3]),"{#LAG}": int(data_list[4])}
                self.result_data = {"{#GROUPNAME}": self.group,"{#TOPICNAME}": data_list[0]}
                self.result_list.append(self.result_data)

        print json.dumps({"data": self.result_list},sort_keys=True,indent=4)



if __name__ == "__main__":
    client = KafkaMonitor()
    client.run()

 

也没啥,就是读取刚才的kafka_monitor.yaml 的配置文件,然后执行一条指令。就是开始的那个指令,获取一些你想要的数据,然后清洗一下格式,得到你想要的结果。用官方的话说就是  kafka_monitor.yaml是输入---> 处理 ---> 得到你想要的结果。

看看结果是啥吧

[root@VM_0_98_centos kafka]# python get_kafka.py 
{
    "data": [
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "mqtt_110_2"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_50"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_25"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_19"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_26"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_22"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_23"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_24"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_21"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_20"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_28"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_27"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_26"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_scm"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_access_172_20_28"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_error_172_20_20"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_access_172_20_20"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_error_172_20_28"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "nginx_error"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "nginx_access"
        }
    ]
}

  

没错,就是groupname和topicname,具体为啥是这种格式,zabbix规定的吧。其中 {#GROUPNAME}和{#TOPICNAME}可以在zabbix-server前端配置页中看做是 宏变量

3)看一下第三个脚本吧get_data.py 

这个是干啥的呢,就是你给我

#!/usr/bin/env python
# coding:utf-8

import yaml
import os
import sys
import subprocess
import re
import time
import json

# ./kafka-consumer-groups.sh --bootstrap-server 172.20.150.1:9092 --describe --group ee

class KafkaMonitor(object):
    def __init__(self):
        self.group_name = sys.argv[1]
        self.topic_name = sys.argv[2]
        self.data_type = sys.argv[3]
        self.bootstrap_server = "172.20.150.1:9092"
        self.cmd = "/opt/kafka/kafka_2.12-2.1.0/bin/kafka-consumer-groups.sh"

        try:
            f = file(os.path.dirname(os.path.abspath(__file__)) + '/' + 'kafka_monitor.yaml')
            self.groups = yaml.load(f)
        except IOError as e:
            print 'Error, kafka_monitor.yaml is not found'
            sys.exit(1)
        else:
            f.close()
            if self.groups is None:
                self.groups = {}
                print 'Error, kafka_monitor.yaml content is empty'
                sys.exit(2)


    def run(self):
        self.result_list = []
        for self.group in self.groups.values()[0].split():
            self.cmd_run = "%s --bootstrap-server %s --describe --group %s | egrep -v 'TOPIC|^$'" % (
            self.cmd, self.bootstrap_server, self.group)
            subp = subprocess.Popen(self.cmd_run, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            self.datas_list = subp.stdout.readlines()
            self.result_dict = {}
            for data_list in self.datas_list:
                data_list = data_list.strip().split()
                if self.group_name == self.group and self.topic_name == data_list[0]:
                    if self.data_type == "offset":
                        print int(data_list[3])
                    elif self.data_type == "logsize":
                        print int(data_list[2])
                    else:
                        print int(data_list[4])

                # self.result_data = {'datetime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), 'topic': data_list[0],
                #                     'group': self.arg1, 'partition': int(data_list[1]), 'logsize': data_list[2],
                #                     'offset': int(data_list[3]), 'lag': data_list[4]}
                # self.result_data = {"{#GROUPNAME}": self.arg1,"{#TOPICNAME}": data_list[0],
                #                     "{#LOGSIZE}": int(data_list[2]),"{#OFFSET}":int(data_list[3]),"{#LAG}": int(data_list[4])}




if __name__ == "__main__":
    client = KafkaMonitor()
    client.run()

以供接收三个参数,groupname和topname,data_type(lag/offset/logsize) 然后输出一个值,看一下执行结果吧

[root@VM_0_98_centos kafka]# python get_data.py ee personal_income_tax_172_20_26 lag
0

  

看到了吧。执行有点慢,到了这步之后,你就可以重启你的zabbix_agent了

 

 

2 zabbix-server 测试
[root@VM_4_84_centos ~]# zabbix_get -s 172.20.150.1 -p 10050 -k kafka.discovery

{
    "data": [
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "mqtt_110_2"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_50"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_25"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_19"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_26"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_22"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_23"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_24"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_172_20_21"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_20"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_28"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_27"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "personal_income_tax_172_20_26"
        }, 
        {
            "{#GROUPNAME}": "ee", 
            "{#TOPICNAME}": "ee_scm"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_access_172_20_28"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_error_172_20_20"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_access_172_20_20"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "personal_income_tax_nginx_error_172_20_28"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "nginx_error"
        }, 
        {
            "{#GROUPNAME}": "ng", 
            "{#TOPICNAME}": "nginx_access"
        }
    ]
}

  

 

[root@VM_4_84_centos ~]# zabbix_get -s 172.20.150.1 -p 10050 -k kafka.data[ng,personal_income_tax_nginx_access_172_20_20,lag]
15

 

看到了吧,是不是很简单

 

3 zabbix-server 页面配置

1)看图吧

看图吧

还是看图吧哈哈

 

2)搞个图出来吧

然后应用到你的主机就可以啦。

 

现在说说为啥这种情况,我选择了LLD呢,因为我的topicname非常多,我不想自己配置,后期还是不断的增加,我也不想配置。那这种LLD的方式可以满足你,这里需要注意一点的是,如果你的组增加了,需要在配置文件中 kafka_monitor.yaml 加上就可以了。

所谓的自动化,我的理解就是想法设法的偷懒,并且标准化的环境,高效的执行,你只需要看着他执行就行了。

写在最后,祝愿天下所有有情人终成眷属

 

转载于:https://www.cnblogs.com/wanstack/p/10536840.html

zabbix snmp 自动发现、自定义自动发现规则和监控项原型实现原理 自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法。 例如,Zabbix可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网络接口手动创建监控项;还可以配置Zabbix根据定期执行发现后的得到实际结果,来移除不需要的监控。 除了 Linux 系统自带的发现字段外,还支持通过 snmp OID 来进行自动发现 用户可以自己定义发现类型,只要脚本的返回值是遵循特定的 JSON 格式。 配置自动发现过程的一般如下: 首先,用户在“配置”→“模板”→“发现”列中创 阅读详情

相关推荐

Zabbix自动发现实战:如何通过自定义脚本实现动态监控(含脚本示例)

本文深入解析Zabbix自动发现功能,通过实战案例展示如何编写自定义脚本实现动态监控。文章详细介绍了从脚本设计、Agent配置到前端规则创建的全流程,并提供了Spring Boot应用端口发现的完整脚本示例,帮助运维人员高效应对微服务等动态环境的监控挑战。

weixin_29268385的博客 290

LD链接脚本

LD链接脚本

wanglei_11的博客 1281

Zabbix自动发现实战:如何用低级别自动发现监控自定义进程(附完整脚本

本文详细介绍了Zabbix低级别自动发现(LLD)在自定义进程监控中的实战应用,通过完整的脚本示例和配置步骤,帮助用户实现动态识别和监控业务特有进程。文章对比了LLD与网络发现、自动注册的区别,并提供了高级优化技巧和问题排查方法,适用于分布式系统中的细粒度监控需求。

weixin_30296405的博客 507

GNU-ld链接脚本浅析

GNU-ld链接脚本浅析 0. Contents1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表达式12. 暗含的连接脚本1. 概论每一个链接过程都由链接

李永刚的专栏 3281

zabbix详解之监控项自动发现(LLD

概述 自动发现(LLD)提供了一种为受监控节点的不同监控指标自动创建监控项,触发器和图形的分发。例如,Zabbix可以在你的机器上自动开始监控服务端口,而无需为每个服务端口手动创建监控项。 此外,可以配置Zabbix根据定期执行发现后的得到实际结果,来移除不需要的监控。 用户可以自己定义发现类型,只要它们遵循特定的JSON协议。 发现过程的一般架构如下。 首先,用户在“配置”→“模板”→“发现”列...

weixin_42155272的博客 5236

使用zabbix模板监控项的自动发现规则(LLD)实现snmp监控交换机

zabbix自动发现规则发现监控项监控网络设备怎么实现呢?一起来看看吧

C_0010的博客 3833

shell脚本实现LLD监控

要实现Zabbix LLD监控,通常需要两个脚本,一个自定义发现check脚本,并输出成Json格式,另一个才是获取监控项values的脚本自定义发现checks脚本输出结果为以下形式:{ "data":[ { "{#APP_NAME}":"AppCMDB" }, { ...

weixin_33958585的博客 274

自定义zabbix中的普通KEY及LLD KEY

普通类型KEY 1、agent端: 编写自定义脚本脚本需要有输出值返回给zabbix-server,并且给对应脚本赋予zabbix用户可执行权限 zabbix-agnet 且定义key名称和command Format: UserParameter=<key>,<shell command> 实例: UserParameter=psql.check,/...

weixin_30336061的博客 219

普通用户可以使用zabbix 监控TCP 80端口吗?创建自定义脚本

创建自定义脚本zabbix普通用户也可以监控TCP 80端口

qq_45429357的博客 642

zabbix html使用c语言写的,zabbix 自定义LLD

线上部分实时job是用storm开发的,为了监控数据的延迟,在storm处理日志的时候会把日志的时间插入到redis中,然后通过zabbix做延迟的监控。由于经常有新的job上线,手动配置监控项就变得比较麻烦,为了解放生产力,还是需要搞成自动化。之前添加网卡和分区监控的时候用了LLD的功能,并用了其内置的宏变量,新版本的zabbix是支持custom LLD的,实现步骤如下:1.在模板中设置一个d...

weixin_28681255的博客 379

zabbix 监控项自动发现过滤_【Zabbix监控教程】LLD低级别自动发现配置教程

低级别自动发现简称LLD,使用低级别自动发现可以实现根据Agent的实际情况去自动创建监控项,适用于配置不一的环境。比如A主机有3块硬盘,B主机有5块硬盘,如果不使用LLD的话就需要人肉去为每个硬盘创建监控项。而有了LLD就可以实现自动创建每个硬盘的监控。本文以监控多实例MySQL为例进行Zabbix低级别自动发现配置:1、创建获取每个MySQL实例端口的脚本。该脚本返回的数据必须是JSON格式,...

weixin_39835792的博客 625

Zabbix low-level discovery

Version: zabbix 3.0.1 概述 Low-Level discovery 可以自动创建items,triggers,graphs为不同的实体对象。 例如:zabbix能自动监控服务器上的所有文件系统,网路接口。而不用手动在每个文件系统,网络接口上创建items。 除此之外,也可以根据discovery返回的结果,配置zabbix移除不需要的实体对象 zabbix支持六种不...

weixin_30765475的博客 266

zabbix redis_low_level_discovery

zabbix 可以通过常见的手段监控到各种服务,通过编写脚本来获取返回值并将获取到的值通过图形来展现出来,包括(系统、服务、业务)层面。可是有些时候在一些不固定的场合监控一些不固定的服务就比较麻烦。例如,服务器运行三台 redis,端口分别是 7000 7001 7002,那么这时候如果需要监控则需要建立三个模板,分别对应不同的模板又要设置不同的 Shell Script 及 UserParamet

wanglei_storage的博客 5807

Zabbix自动发现实战:如何通过自定义脚本实现服务端口监控(含避坑指南)

本文深入探讨了Zabbix自动发现功能在服务端口监控中的实战应用。通过编写自定义脚本作为数据源,详细解析了从脚本设计、Agent与Server配置到多层测试验证的全流程,并提供了性能优化与处理动态端口等高级场景的解决方案,帮助运维人员构建健壮的自动化监控体系。

s4t5u6v7的博客 402

Zabbix监控实战:如何用SNMP和自定义脚本监控企业级服务器

本文深入探讨了在企业级环境中如何利用Zabbix进行高效监控。文章重点介绍了超越基础监控的核心思路,并提供了使用SNMP协议监控网络设备与服务器硬件的实战配置方法,以及通过自定义脚本和UserParameter机制扩展监控能力的终极方案,旨在帮助运维工程师构建可扩展的智能监控体系。

milk8的博客 427

Zabbix –内核,CPU和硬盘的低级发现

Zabbix SSD状态,配置有低级发现 在家里,我正在使用Zabbix监视服务器,它具有许多有趣的功能,并且可以通过使用User Parameter进行很多扩展。 在这篇文章中,我将讨论低级发现(LLD)。 如果您只对最终结果感兴趣,请转到“结论”部分,您可以下载包含所有规则的模板! 低层发现(LLDLLD是一项功能,可自动发现受监视主机的某些属性并创建项目,触发器和图形...

danpob13624的博客 308

zabbix:使用自定义模板监控服务器中的多个节点

1.模板是什么,其有什么作用? 模板就是将某一类事情的结构规律予以固定化、标准化的成果。 作用: 例如:你需要给一百台服务器添加CPU、内存、硬盘、网络的item,如果没有模板你就需要一台服务器一台服务器的来,这样就导致很浪费时间,模板就是拟建立一个针对这些服务器的模板,模板的内容就是添加CPU、内存、硬盘、网络的item。这样我们就只需要将这一百个服务器链接这个模板即使用这个模板,这样就可...

一直在路上的羊的博客 1051
上一篇: zabbix自动化监控基础
aa43795381
博客等级 码龄11年 2粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值