本文介绍使用函数计算编写代码相关的基础概念信息,包括请求处理程序、函数实例生命周期回调方法、日志记录和错误处理等。

请求处理程序

在创建函数时,您需要指定请求处理程序。函数计算的运行时会加载并调用您的请求处理程序处理请求。请求处理程序包含以下两种类型:
  • 事件请求处理程序

    用于处理除HTTP触发器以外的各种事件源触发的事件请求。

  • HTTP请求处理程序

    用于处理HTTP触发器触发的请求调用。更多信息,请参见配置HTTP触发器并使用HTTP触发

您可以在函数计算控制台配置请求处理程序(函数入口)。具体操作,请参见更新函数

函数实例生命周期回调方法

函数的按量实例动态按需创建,闲置时会被冻结,冻结一段时间会被销毁,您配置的实例生命周期回调方法在实例状态发生变化时被调用。函数计算支持InitializerPreFreezePreStop三种生命周期回调方法。更多信息,请参见函数实例生命周期

Initializer回调

Initializer回调是在函数实例启动成功之后,执行请求处理程序之前执行。函数计算保证在一个实例生命周期内,成功执行且只能成功执行一次Initializer回调。例如,您的Initializer回调首次执行失败后系统会重试,直到成功为止,然后再执行您的请求处理程序。您可以将数据库场景下连接池构建、函数依赖库加载等耗时较长的业务逻辑放到Initializer回调中,避免每次运行函数都会做重复的操作,降低函数延时。

PreFreeze回调

PreFreeze回调在函数实例冻结前执行,您可以在该回调完成实例冻结前的必要操作,例如等待指标发送成功等。

PreStop回调

PreStop回调在函数实例销毁前执行,您可以在该回调完成实例销毁前的必要操作,例如关闭数据库链接,以及上报、更新状态等。

日志记录

说明
  • 您需要配置服务级别的日志库,函数计算会将函数日志发送到指定日志库中。更多信息,请参见配置日志
  • 通过控制台创建服务时,函数计算默认为您配置日志库。

函数计算与日志记录集成,函数计算会将函数调用的记录以及函数代码中打印的日志全部存储到日志库中,您可以使用函数计算提供的日志语句记录函数日志,方便调试及定位问题。各种编程语言的打印日志语句,如下表所示:

开发语言 编程语言内嵌的打印日志语句 函数计算提供的日志语句 参考文档
Node.js console.log() context.logger.info() 打印日志
Python print() logging.getLogger().info() 打印日志
Java System.out.println() context.getLogger().info() 编译部署代码包
PHP echo "" . PHP_EOL $GLOBALS['fcLogger']->info() 打印日志
C# Console.WriteLine("") context.Logger.LogInformation() 打印日志

使用编程语言内嵌的打印输出语句打印的日志也会被收集到日志库里,而使用函数计算提供的日志语句打印的每条日志前都会带上请求ID,方便日志的筛选。

#使用编程语言内嵌的打印输入语句打印的日志
# print('hello world')
message:  hello world

#使用函数计算提供的日志语句打印的日志
# logger.info('hello world')
message:  2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
            

日志组成

函数运行日志包括服务名称、函数名称、当前执行版本、别名和代码日志。

函数运行日志数据结构如下所示:

__source__:  
__tag__:__receive_time__:  1584072413
__topic__:  myService
functionName:  myFunction
message:  2020-03-13T04:06:49.099Z f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650 [INFO] hello world
qualifier:  LATEST
serviceName:  myService
versionId:         
  • 在函数开始执行时,系统会打印FC Invoke Start RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650,标志函数执行开始。
  • 在函数执行完成时,系统会打印FC Invoke End RequestId: f84a9f4f-2dfb-41b0-9d6c-1682a2f3a650,标志函数执行结束。

错误处理

函数计算的错误类型有两种,分别是HandledInvocationErrorUnhandledInvocationError

  • HandledInvocationError

    只有在Node.js中通过callback返回的错误是HandledInvocationError,错误信息在响应内容中体现。

    'use strict';
      module.exports.handler = function(event, context, callback) {
        console.log('hello world');
        callback('this is error', 'hello world');
      }          

    响应内容如下所示:

    {"errorMessage":"this is error"}          
  • UnhandledInvocationError

    除了HandledInvocationError,其余的错误都是UnhandledInvocationError

    UnhandledInvocationError的错误stackTrace会打印到日志中,您可以进入日志查看上下文,找到对应的stackTrace