Ceilometer RESTful框架

ceilometer-api使用pecan和flask来构建restful api,这里简单介绍一下pecan和flask的使用。

ceilomter-api服务启动流程

/usr/bin/ceilometer-api

...
from ceilometer.cli import api

if __name__ == "__main__":
    sys.exit(api())...

/usr/lib/python2.6/site-packages/ceilometer/cli.py

...def api():
    service.prepare_service()
    srv = app.build_server()
    srv.serve_forever()...

/usr/lib/python2.6/site-packages/ceilometer/api/app.py

...def build_server():
    # Build the WSGI app
    root = VersionSelectorApplication()

    # Create the WSGI server and start it
    host, port = cfg.CONF.api.host, cfg.CONF.api.port
    server_cls = get_server_cls(host)
    srv = simple_server.make_server(host, port, root, server_cls)...
...class VersionSelectorApplication(object):
    def __init__(self):
        pc = get_pecan_config()
        pc.app.debug = CONF.debug
        pc.app.enable_acl = (CONF.auth_strategy == ‘keystone‘)
        if cfg.CONF.enable_v1_api:
            from ceilometer.api.v1 import app as v1app
            self.v1 = v1app.make_app(cfg.CONF, enable_acl=pc.app.enable_acl)
        else:
            def not_found(environ, start_response):
                start_response(‘404 Not Found‘, [])
                return []
            self.v1 = not_found
        self.v2 = setup_app(pecan_config=pc)

    def __call__(self, environ, start_response):
        if environ[‘PATH_INFO‘].startswith(‘/v1/‘):
            return self.v1(environ, start_response)
        return self.v2(environ, start_response)...

如上图所示,ceilometer-api有两种版本即V1和V2,分别使用Flask和Pecan来构建RESTful api,其中V1在Havana已deprecated。

Pecan 是轻量的web框架,主页http://pecan.readthedocs.org/ ,其中URL Mapping如下图:

ceilometer使用pecan代码如下:

/usr/lib/python2.6/site-packages/ceilometer/api/app.py

...def setup_app(pecan_config=None, extra_hooks=None):
    # FIXME: Replace DBHook with a hooks.TransactionHook
    app_hooks = [hooks.ConfigHook(),
                 hooks.DBHook(
                     storage.get_connection(cfg.CONF, ‘metric‘),
                     storage.get_connection(cfg.CONF, ‘event‘),
                 ),
                 hooks.PipelineHook(),
                 hooks.TranslationHook()]
    if extra_hooks:
        app_hooks.extend(extra_hooks)

    if not pecan_config:
        pecan_config = get_pecan_config()

    pecan.configuration.set_config(dict(pecan_config), overwrite=True)

    app = pecan.make_app(
        pecan_config.app.root,
        static_root=pecan_config.app.static_root,
        template_path=pecan_config.app.template_path,
        debug=CONF.debug,
        force_canonical=getattr(pecan_config.app, ‘force_canonical‘, True),
        hooks=app_hooks,
        wrap_app=middleware.ParsableErrorMiddleware,
        guess_content_type_from_ext=False
    )

    if getattr(pecan_config.app, ‘enable_acl‘, True):
        return acl.install(app, cfg.CONF)

    return app...

ceilometer中pecan的配置 /usr/lib/python2.6/site-packages/ceilometer/api/config.py

...app = {
    ‘root‘: ‘ceilometer.api.controllers.root.RootController‘,
    ‘modules‘: [‘ceilometer.api‘],
    ‘static_root‘: ‘%(confdir)s/public‘,
    ‘template_path‘: ‘%(confdir)s/ceilometer/api/templates‘,
}...

RootController /usr/lib/python2.6/site-packages/ceilometer/api/controllers/root.py

...class RootController(object):

    v2 = v2.V2Controller()

    @pecan.expose(generic=True, template=‘index.html‘)
    def index(self):
        # FIXME: Return version information
        return dict()...

V2Controller包含多个Resource的Controller, /usr/lib/python2.6/site-packages/ceilometer/api/controllers/v2.py

class V2Controller(object):
    """Version 2 API controller root."""

    resources = ResourcesController()
    meters = MetersController()
    samples = SamplesController()
    alarms = AlarmsController()
    event_types = EventTypesController()
    events = EventsController()
    status = StatusController()
    query = QueryController()
    capabilities = CapabilitiesController()

下面以MetersController进行分析:/usr/lib/python2.6/site-packages/ceilometer/api/controllers/v2.py

class MetersController(rest.RestController):
    """Works on meters."""

    @pecan.expose()
    def _lookup(self, meter_name, *remainder):
        return MeterController(meter_name), remainder
    #wsme_pecan是来自wsmeext.pecan
    @wsme_pecan.wsexpose([Meter], [Query])
    def get_all(self, q=[]):
        """Return all known meters, based on the data recorded so far.

        :param q: Filter rules for the meters to be returned.
        """
        #Timestamp field is not supported for Meter queries
        kwargs = _query_to_kwargs(q, pecan.request.metric_conn.get_meters,
                                  allow_timestamps=False)
        return [Meter.from_db_model(m)
                for m in pecan.request.metric_conn.get_meters(**kwargs)]

这里用到了wsme和wsmeext.pecan。wsme即Web Services Made Easy,简化了REST Web服务的编写。可以运行在另一个框架的顶层,如(Cornice、Flask、Pecan)等,这里就是运行在了pecan之上来更加简单的构建restapi,用法:

wsmeext.pecan.wsexpose(return_type, *arg_types, **options)

Flask与Pecan类似,是基于Python的开源微RESTful框架,ceilometer使用Flask代码如下: /usr/lib/python2.6/site-packages/ceilometer/api/v1/app.py

...def make_app(conf, enable_acl=True, attach_storage=True,
             sources_file=‘sources.json‘):
    app = flask.Flask(‘ceilometer.api‘)
    app.register_blueprint(v1_blueprint.blueprint, url_prefix=‘/v1‘)

    app.json_encoder = JSONEncoder

    try:
        with open(sources_file, "r") as f:
            sources = jsonutils.load(f)
    except IOError:
        sources = {}

    @app.before_request
    def attach_config():
        flask.request.cfg = conf
        flask.request.sources = sources

    if attach_storage:
        @app.before_request
        def attach_storage():
            flask.request.storage_conn =                 storage.get_connection(conf)

    # Install the middleware wrapper
    if enable_acl:
        app.wsgi_app = acl.install(app.wsgi_app, conf)

    return app...
app.register_blueprint 注册RESTful方法,如下图示
blueprint = flask.Blueprint(‘v1‘, __name__,
                            template_folder=‘templates‘,
                            static_folder=‘static‘)

@blueprint.route(‘/meters‘)
def list_meters_all():
    """Return a list of meters.
    :param metadata.<key>: match on the metadata within the resource.
                           (optional)
    """
    rq = flask.request
    meters = rq.storage_conn.get_meters(
        project=acl.get_limited_to_project(rq.headers),
        metaquery=_get_metaquery(rq.args))
    return flask.jsonify(meters=[m.as_dict() for m in meters])
时间: 2024-08-09 11:11:03

Ceilometer RESTful框架的相关文章

Java Restful框架:Jersey入门示例(官方例子)

本文主要介绍了Java Restful框架Jersey入门例子(来源于官方网站https://jersey.java.net/),废话不多说进入正题. 在Jersey官方示例中(https://jersey.java.net/documentation/latest/getting-started.html),入门例子主要采用maven构建,在这里使用eclipse来创建我们的项目 1.使用maven 骨架方式创建项目,如下图, 2.,如果在eclipser中没有上面的选项,我们需要手动添加Je

Java RESTful 框架的性能比较

2017-02-03 ImportNew (点击上方公众号,可快速关注) 来源:鸟窝, colobu.com/2015/11/17/Jax-RS-Performance-Comparison/ 如有好文章投稿,请点击 → 这里了解详情 在微服务流行的今天,我们会从纵向和横向分解代码的逻辑,将一些独立的无状态的代码单元实现为微服务,可以将它们发布到一些分布式计算单元或者Docker中,并在性能需要的时候及时地创建更多的服务单元. 微服务是一个概念,并没有规定服务的格式,但是很多厂商和框架都不约而同

最好的8个 Java RESTful 框架

过去的每一年,涌现出越来越多的Java框架.就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的.连我的老祖母现在也使用 一个我从来没有听说过而且可能永远不会使用的框架.玩笑归玩笑,可以做几乎任何事的臃肿的框架市场已经饱和,,但是如何评判呢?这篇文章旨在提供目前最好的 Java RESTfulful 框架.我只介绍轻量级的产品, 略过了那些臃肿的过度设计的框架.同时,我只想要他们稳定和成熟,提供简单,轻量级的特点.我只在介绍Play frameworks时打破这条规则,

Java实现Restful框架Jersey学习

Java与REST的邂逅(一):浅谈Jersey及JAX-RS Java与REST的邂逅(二):JAX-RS核心Annotation Java与REST的邂逅(三):浅谈Jersey MVC Java实现Restful框架Jersey学习

基于Netty实现的RESTful框架--netty-rest-server

在工作中用Netty做了几个服务,感觉Netty做出来的程序性能好,资源占用少,但是实现Http服务比较麻烦,于是就参考Spring MVC的注解基于Netty实现了一个轻量级的RESTful框架. 该框架提供了控制器注解.全局异常控制器.拦截器等功能. 注解名称参考了Spring MVC,编译理解和记忆,主要包括如下注解: @RestController @RequestMapping @GetMapping @PostMapping @DeleteMapping @PutMapping @P

PHP再学习5——RESTFul框架 远程控制LED

0.前言 去年(2013年)2月第一次接触yeelink平台,当时该平台已经运行了一些时间也吸引了不少极客.试想自己也将投身IoT(物联网)行业,就花了些时间研究了它.陆陆续续使用和研究了一年,大致围绕两个问题展开——1.yeelink平台如何使用,2.如何构造一个功能简单些的yeelink平台.    [PHP学习笔记——索引博文] 本文将讨论如何构造一个简单restful架构平台(该平台有点像yeelink,不过功能比yeelink少的多),并结合树莓派实现LED的远程控制(网络控制).构建

RESTful 服务架构风格 * .NET的RESTful框架 OpenRasta

REST 的约束采用的就是掌控 Web 的基本原则.这些原则是: 用户代理与资源交互,任何可命名和表达的事物都可称为资源.每项资源都有一个唯一的统一资源标识符 (URI). 与资源的交互(通过其唯一的 URI 定位)使用 HTTP 标准动词(GET.POST.PUT 和 DELETE)的统一接口完成.交互中声明资源的媒体类型也很重要,它使用 HTTP 内容类型标头指定.(XHTML.XML.JPG.PNG 和 JSON 就是一些广为人知的媒体类型.) 资源是自我描述的.处理资源请求所需的全部信息

maven,springmvc,mybatis,bootstrap,restful 框架整合

下载源码猛搓这里 maven构建springmvc+mybatis+rest+bootstrap(cms开源)SpringMVC + Mybatis + SpringSecurity(权限控制到方法按钮) + Rest(服务) + Webservice(服务) + Quartz(定时调度)+ Lucene(搜索引擎) + HTML5 bootstrap + Maven项目构建绝对开源平台项目Mave构建,模拟大型互联网架构,做到高并发,大数据处理,整个项目使用定制化服务思想,提供原子化.模块化的

使用Grizzy+Jersey搭建一个RESTful框架()报错Exception in thread &quot;main&quot; java.lang.AbstractMethodError: javax.ws.rs.core.UriBuilder.uri(Ljava/lang/String;)Ljavax/ws/rs/core/UriBuilder;

报错的类涉及UriBuilder,我搜索类发现, 这个类存在于两个包中,我在baidu的时候,也有人提到是jar包冲突,我就删除了 这个依赖,问题解决了. 环境搭建过程请见地址https://blog.csdn.net/jinxfei/article/details/4714809 原文地址:https://www.cnblogs.com/BaleW/p/8668712.html