RyuBook1.0案例二:Traffic Monitor项目源码分析

简介: RyuBook1.0案例二:Traffic Monitor项目源码分析

Traffic Monitor源码分析

从simple_switch_13.SimpleSwitch13控制器继承并开发

class SimpleMonitor13(simple_switch_13.SimpleSwitch13):

增添datapaths列表,存储交换机id

def __init__(self, *args, **kwargs):
    super(SimpleMonitor13, self).__init__(*args, **kwargs)
    self.datapaths = {}

引入hub.spawn()函数启动一个新线程,输入为一个新的方法_monitor

创建一个EventOFPStateChange监听事件,监听MAIN_DISPATCHER,DEAD_DISPATCHER两种情况。

@set_ev_cls(ofp_event.EventOFPStateChange,
                [MAIN_DISPATCHER, DEAD_DISPATCHER])

监听如果为MAIN_DISPATCHER,并且datapath.id不在datapath列表中,则证明是新加入的交换机

if ev.state == MAIN_DISPATCHER:
      if datapath.id not in self.datapaths:
           self.logger.debug('register datapath: %016x', datapath.id)
           self.datapaths[datapath.id] = datapath

如果为DEAD_DISPATCHER,并且datapath.id在datapath列表中,则证明是掉线的交换机

 elif ev.state == DEAD_DISPATCHER:
        if datapath.id in self.datapaths:
            self.logger.debug('unregister datapath: %016x', datapath.id)
            del self.datapaths[datapath.id]

_monitor方法,循环不断向datapath列表中的交换机发送Flow状态请求,和Port状态请求

def _monitor(self):
    while True:
        for dp in self.datapaths.values():
            self._request_stats(dp)
        hub.sleep(10)
def _request_stats(self, datapath):
      self.logger.debug('send stats request: %016x', datapath.id)
      ofproto = datapath.ofproto
      parser = datapath.ofproto_parser

      req = parser.OFPFlowStatsRequest(datapath)
      datapath.send_msg(req)

      req = parser.OFPPortStatsRequest(datapath, 0, ofproto.OFPP_ANY)
      datapath.send_msg(req)

刚刚发送了请求,现在监听其回复

@set_ev_cls(ofp_event.EventOFPFlowStatsReply, MAIN_DISPATCHER)
...

@set_ev_cls(ofp_event.EventOFPPortStatsReply, MAIN_DISPATCHER)
...

打印返回的信息

for stat in sorted([flow for flow in body if flow.priority == 1],
                   key=lambda flow: (flow.match['in_port'],
                                     flow.match['eth_dst'])):
    self.logger.info('%016x %8x %17s %8x %8d %8d',
                     ev.msg.datapath.id,
                     stat.match['in_port'], stat.match['eth_dst'],
                     stat.instructions[0].actions[0].port,
                     stat.packet_count, stat.byte_count)

...
for stat in sorted(body, key=attrgetter('port_no')):
     self.logger.info('%016x %8x %8d %8d %8d %8d %8d %8d',
          ev.msg.datapath.id, stat.port_no,
          stat.rx_packets, stat.rx_bytes, stat.rx_errors,
          stat.tx_packets, stat.tx_bytes, stat.tx_errors)

其中sorted ... lambda语法,指元组的排列顺序按照先in_porteth_dst

至此,整个程序解析完毕。

目录
相关文章
|
Java jvm-sandbox Perl
Jvm-Sandbox源码分析--启动简析
1.工作原因,使用jvm-sandbox比较多,遂进行源码分析,做到知己知彼,个人能力有限,如有错误,欢迎指正。 2.关于jvm-sandbox 是什么,如何安装相关环境,可移步官方文档 3.源码分析基于jvm-sandbox 最新的master代码,tag-1.2.1。
8020 0
Jvm-Sandbox源码分析--启动简析
|
6月前
|
弹性计算 移动开发 Serverless
Serverless 应用引擎操作报错合集之部署stable启动时出现:Function instance health check failed on port 5000 in 120 seconds该怎么解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
监控 前端开发 JavaScript
shin-monitor源码分析
shin-monitor源码分析
|
监控 Dubbo Java
监控中心 - Simple Monitor 安装|学习笔记
快速学习监控中心 - Simple Monitor 安装
|
存储 监控 安全
[知识小节]Process Monitor介绍(下)
[知识小节]Process Monitor介绍
1098 0
[知识小节]Process Monitor介绍(下)
|
监控 安全 网络协议
[知识小节]Process Monitor介绍(上)
[知识小节]Process Monitor介绍
1204 0
[知识小节]Process Monitor介绍(上)
|
Kubernetes 负载均衡 监控
kube-proxy源码分析:深入浅出理解k8s的services工作原理
在进行k8s实践中, services 是经常碰到的资源对象,services 充当了 k8s 集群 pod 服务抽象的功能,为后端pod 提供了负载均衡和服务发现,那他到底是如何工作的呢,这里从 services 的具体实现 kube-proxy 出发解读 services 的工作机制。
2349 1
kube-proxy源码分析:深入浅出理解k8s的services工作原理
|
缓存 Java API
【Java并发编程实战14】构建自定义同步工具(Building-Custom-Synchronizers)(中)
JDK包含许多存在状态依赖的类,例如FutureTask、Semaphore和BlockingQueue,他们的一些操作都有前提条件,例如非空、任务已完成等。
116 0
|
缓存 安全 Java
【Java并发编程实战14】构建自定义同步工具(Building-Custom-Synchronizers)(上)
JDK包含许多存在状态依赖的类,例如FutureTask、Semaphore和BlockingQueue,他们的一些操作都有前提条件,例如非空、任务已完成等。
130 0
|
设计模式 缓存 算法
【Java并发编程实战14】构建自定义同步工具(Building-Custom-Synchronizers)(下)
JDK包含许多存在状态依赖的类,例如FutureTask、Semaphore和BlockingQueue,他们的一些操作都有前提条件,例如非空、任务已完成等。
170 0